0

我正在用 C# 为 WP8 平台编写我的第一个应用程序。我实现了三种数据类型,即具有 locationGroups 的 locationModel。每个 locationGroup 都有一个 locationData 类型的 ObservableCollection。

locationData 具有纬度和经度的两种双精度类型以及标题字符串。

我在 stackpanel 中使用了一个文本块来显示 locationData 元素的标题,其中 lat long 对用户隐藏。每个文本块元素上都有一个上下文菜单,使用户能够删除相应的 locationData。当我打开应用程序并删除任何项目时,它也会成功执行并更新视图。但是当我为另一个项目做这件事时,它就不起作用了。每次打开应用程序时,我不能删除多个项目。

我使用断点来查看问题所在。选定的 locationData 成功传递给 App.ViewModel.LocationModel.Items.Remove()。但只是它们没有从可观察的集合中删除。我什至尝试查看可观察集合中 locationData 的索引并使用 RemoveAt 方法。即使它不起作用。我做了很多研究来发现问题,但似乎没有人像我一样面临同样的问题。我参考了关于如何实现 inotifypropertychanged 来更新集合的 msdn 文章。但它太复杂了,我无法理解。

我真的不明白为什么即使我通过了该项目的索引,可观察集合也会第二次删除该项目。我对断点的使用表明数据甚至不是空的。

所以请告诉我是什么导致了这个问题,我该如何克服它,以便我可以实施自己的解决方法,而不会再次遇到这个问题。如果你愿意,我可以给你看代码。谢谢。

代码:添加项目

private void SaveLocationData(LocationData locationData)
    {
        IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;

        try
        {
            App.ViewModel.Custom.Items.Add(locationData);
            var data = JsonConvert.SerializeObject(App.ViewModel.Custom);

            appSettings[LocationModel.CustomKey] = data;
            appSettings.Save();

            //Notify that data is changed
            App.ViewModel.LoadData();
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.RelativeOrAbsolute));
        }
        catch(IsolatedStorageException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

删除项目:

private void DeleteLocationData(LocationData locationData)
    {
        IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;

        try
        {
            App.ViewModel.Custom.Items.Remove(locationData);
            var data = JsonConvert.SerializeObject(App.ViewModel.Custom);

            appSettings[LocationModel.CustomKey] = data;
            appSettings.Save();

            //Notify that data is changed
            App.ViewModel.LoadData();
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.RelativeOrAbsolute));
        }

        catch (IsolatedStorageException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

我要说的另一件事是,每当我将 locationData 添加到集合中时,它都会自动更新。因为添加是在另一个页面上完成的,并且当 mainpage.xaml 加载(可观察的集合数据所在的位置)时,由于 OnNavigatedTo 方法中的代码,它会自动更新。

protected override void OnNavigatedTo(NavigationEventArgs e)
    {

        if (!App.ViewModel.IsDataLoaded)
        {
            App.ViewModel.LoadData();
        }

    }

LoadData 方法是:

public void LoadData()
    {

        Custom = LoadCustomLocations();
        IsDataLoaded = true;

    }

    private LocationGroup LoadCustomLocations()
    {
        string dataFromAppSettings;
        LocationGroup data;

        if (IsolatedStorageSettings.ApplicationSettings.TryGetValue(CustomKey, out dataFromAppSettings))
        {
            data = JsonConvert.DeserializeObject<LocationGroup>(dataFromAppSettings);
        }
        else
        { 
            data = new LocationGroup();
        }

        return data;
    }

那么,有人可以帮忙吗?

4

1 回答 1

0

在您在评论中描述的情况下,我认为您将 DataContext 设置为您的项目。当您创建一个新的 Items-List 时,DataContext 将丢失。所以你必须将 DataContext 重置为新加载的 Items-List

于 2013-08-23T13:09:29.323 回答