我正在用 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;
}
那么,有人可以帮忙吗?