C# で WP8 プラットフォーム用の最初のアプリケーションを作成しています。locationGroups を持つ locationModel という 3 つのデータ型を実装しました。各 locationGroup には、タイプ locationData の ObservableCollection があります。
locationData には、緯度と経度の 2 つの double 型と、タイトル文字列があります。
スタックパネル内のテキストブロックを使用して、locationData 要素のタイトルを表示しました。ここで、緯度経度はユーザーに隠されています。この textblock 要素ごとにコンテキスト メニューがあり、ユーザーはそれぞれの locationData を削除できます。アプリを開いてアイテムを削除すると、ビューも正常に更新されます。しかし、別のアイテムに対してそれを行うと、うまくいきません。アプリを開くたびに複数のアイテムを削除できません。
ブレークポイントを使用して、問題の場所を確認しました。選択された locationData は App.ViewModel.LocationModel.Items.Remove() に正常に渡されます。しかし、監視可能なコレクションから削除されていないだけです。観測可能なコレクションで locationData のインデックスを確認し、RemoveAt メソッドを使用しようとさえしました。それでもうまくいきません。問題を見つけるために多くの調査を行いましたが、誰も私と同じ問題に直面していないようです。コレクションを更新するために inotifypropertychanged を実装する方法については、msdn の記事を参照しました。しかし、私にはそれを理解するには複雑すぎます。
そのアイテムのインデックスを渡しても、監視可能なコレクションがアイテムを2回目に削除する理由がよくわかりません。また、ブレークポイントを使用すると、データが null でさえないことがわかりました。
この問題の原因と、この問題に再び直面しないように独自の回避策を実装できるようにするにはどうすればよいか教えてください。必要に応じてコードを表示できます。ありがとう。
コード: アイテムの追加
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);
}
}
もう 1 つ言いたいのは、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;
}
それで、誰でも助けることができますか?