可观察的集合只删除一次项目,当再次尝试时不起作用-Windows phone 8-C#

本文关键字:8-C# phone -Windows 不起作用 一次 集合 观察 删除 项目 | 更新日期: 2023-09-27 18:28:48

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

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

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

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

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

因此,请告诉我是什么导致了这个问题,以及我如何克服它,这样我就可以实现自己的解决方案,而不会再次面临这个问题。如果你愿意,我可以给你看代码。谢谢

代码:添加项目

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;
    }

那么,有人能帮忙吗?

可观察的集合只删除一次项目,当再次尝试时不起作用-Windows phone 8-C#

在您的评论中描述的情况下,我认为您将DataContext设置为Items。创建新的项目列表时,DataContext将丢失。因此,您必须将DataContext重置为新加载的项目列表