可观察的集合只删除一次项目,当再次尝试时不起作用-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;
}
那么,有人能帮忙吗?
在您的评论中描述的情况下,我认为您将DataContext设置为Items。创建新的项目列表时,DataContext将丢失。因此,您必须将DataContext重置为新加载的项目列表