11

私は 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 つはアカウント ビューモデルの監視可能なコレクションです。これは厄介なようで、これを行うためのより良い方法が必要です。

4

2 に答える 2

4

ObservableCollection はオブジェクトの独自の内部リストを保持しているため、ObservableCollection を使用するとこれ以上うまくいくとは思いません。

ただし、INotifyCollectionChanged と INotifyPropertyChanged を実装するカスタム コレクションを実装する場合は、ソース コレクションをラップしてフィルター処理することができます。

これらが表示されないように、IsDeleted フラグでフィルター処理できます。

ユーザーがアイテムを削除するたびに、ドメイン モデルを直接変更して、IsDeleted フラグを true に設定できます。ただし、適切なイベントを発生させるにはイベント メカニズムが必要ですが、その方法ではアイテムのコレクションは 1 つしかありません。

カスタム コレクションは、イベントが追加された、ドメイン モデルに対する単純な射影になります。

于 2010-01-26T11:59:43.187 に答える
4

ここで例を見つけることができます: http://blog.lexique-du-net.com/index.php?post/2010/03/02/MV-VM-How-to-keep-collections-of-ViewModel-and -同期中のモデル

この助けを願っています

于 2010-03-02T15:48:00.740 に答える