2

ビュー モデル内のプロパティとして公開されている監視可能なコレクションがあります。監視可能なコレクションには、データ アクセス レイヤー (linq2sql) からのオブジェクトが読み込まれます。

新しいアイテムが別のビュー モデルを介してデータベースに追加された場合、監視可能なコレクションを更新する最良の方法は何ですか? データベースへのクエリを使用して監視可能なコレクションを再作成するか、新しいオブジェクトをコレクションに直接挿入する必要がありますか?

また、あるビューモデルを別のビューモデルと通信させる方法をまだ模索中ですが、mvvm を使用したのは 3 日間だけです。

4

4 に答える 4

3

まったく新しいクラスを使用して、あるクラスから別のクラスへの通知を管理できます。すべてのエンティティをロードするか、新しく追加されたエンティティを追加するかに関する質問については、毎回ロードできるエンティティの数に大きく依存します。それらが非常に少ない場合は、毎回それらをリロードできます。そうでない場合は、新しく追加されたオブジェクトをコレクションに追加するだけです。

例:

class ViewModel1
{
    ObservableCollection<Object> entities;

    public ViewModel1()
    {
        EventsManager.ObjectAddedEvent += new EventHandler<ObjectAddedEventArgs>(EventsManager_ObjectAddedEvent);
        entities = new ObservableCollection<Object>();
    }

    void EventsManager_ObjectAddedEvent(object sender, ObjectAddedEventArgs e)
    {
        entities.Add(e.ObjectAdded);
    }
}

class EventsManager
{
    public static event EventHandler<ObjectAddedEventArgs> ObjectAddedEvent;

    public static void RaiseObjectAddedEvent(Object objectAdded)
    {
        EventHandler<ObjectAddedEventArgs> temp = ObjectAddedEvent;
        if (temp != null)
        {
            temp(null, new ObjectAddedEventArgs(objectAdded));
        }
    }
}

class ObjectAddedEventArgs : EventArgs
{
    public Object ObjectAdded { get; protected set; }

    public ObjectAddedEventArgs(Object objectAdded)
    {
        ObjectAdded = objectAdded;
    }
}

class ViewModel2
{
    public void AddObject(Object o)
    {
        EventsManager.RaiseObjectAddedEvent(o);
    }
}
于 2010-06-17T08:25:18.967 に答える
2

モデルオブジェクトがデータベースに保存されるたびに、保存されたモデルオブジェクトを含むメッセージをビューモデルに送信します。これは、MVVMLightToolkitのMessengerヘルパークラスを使用して実現できます。

于 2010-06-17T08:21:13.063 に答える
1

2 番目の部分 (ビュー モデルを相互に対話させる方法) については、ビュー モデルをできるだけ分離したままにしておくことを好みます。したがって、イベント集約またはある種のメッセージ ブローカが自然な選択のようです。

質問の最初の部分は少しトリッキーで、正解がわかりません。Observable コレクションに何千ものアイテムが含まれている場合、完全な再構築を伴わないアプローチを選択しようとします。それ以外の場合は、思いつく最も単純で簡単な解決策を試してください。

于 2010-06-17T08:25:37.233 に答える
0

私が作成したライブラリを使用して、1 つの DataContext が変更を親 DataContext に効果的に保存し、親 DataContext が変更を受け取ったことを子に通知できるようにします。

この機能を使用して、アプリケーション全体に対して 1 つのマスター DataContext を作成し、次に、[OK] ボタンと [キャンセル] ボタンを含むモーダル ウィンドウ、または独自の「現実のビュー」を一時的に必要とする UI のその他の部分に対して、子 DataContext を作成します。子の DataContext が親に書き戻すと、親のオブジェクトにバインドされたすべてのコントロールが更新され、親がすべての子に変更をブロードキャストして、それらも更新できるようにします (スナップショット モードの場合はできません)。

このソリューションはコーディングに時間がかかりましたが、うまく機能します。また、まったく同じメカニズムを使用して、他のクライアントによって共有されているサーバー上の親 DataContext に変更を送信するため、すべての人が最新のデータを取得し、優れたキャッシュ パフォーマンスを得ることができます。バックエンドのデータ ストアとの通信にも使用しています。

于 2010-06-17T14:06:28.973 に答える