私は wpf ツールキット データグリッドを使用して、AccountViewModels の観察可能なコレクションを表示しています。
問題は、グリッドからアカウントを削除するときです。ObservableCollection から削除してユーザーに視覚的なフィードバックを提供したいのですが、「IsDeleted」フラグをオンにして、アカウント モデルの基になるリストを同じままにしておきたいのです。アカウント モデル。
その後、変更がコミットされるたびに、サービスはデータベースで追加/更新または削除するアカウントを認識します。
CollectionChanged イベントを購読しています:
AccountViewModels.CollectionChanged += AccountsChanged;
次に、何かが削除されるたびにビューモデルのモデル isdeleted フラグを true に設定します。
private void AccountsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (AccountViewModel model in e.NewItems)
{
model.PropertyChanged += accountPropertyChanged;
model.Account.IsNew = true;
}
}
if (e.OldItems != null)
{
foreach (AccountViewModel model in e.OldItems)
{
model.PropertyChanged -= accountPropertyChanged;
model.Account.IsDeleted = true;
}
}
}
しかし、明らかにこれにより、監視可能なコレクションから削除されます。そのため、変更をコミットすると、IsDeleted フラグが設定されたアカウントはなくなります。つまり、それらはすでに削除されています。
foreach (AccountViewModel acc in m_ViewModel.AccountViewModels)
{
WorkItem workItem = null;
if(acc.Account.IsNew)
workItem = new WorkItem("Saving new account: " + acc.AccountName, "Saving new account to the database", () => Service.AddAccount(acc.Account));
else if (acc.Account.IsDeleted)
workItem = new WorkItem("Removing account: " + acc.AccountName, "Setting account inactive in the database", () => Service.RemoveAccount(acc.Account));
else if(acc.Account.IsDirty)
workItem = new WorkItem("Updating account: " + acc.AccountName, "Updating account in the database", () => Service.UpdateAccount(acc.Account));
workItems.Add(workItem);
}
これは、2 つのリストを維持する必要があるということですか? 1 つはアカウント モデルのリストで、もう 1 つはアカウント ビューモデルの監視可能なコレクションです。これは厄介なようで、これを行うためのより良い方法が必要です。