13

複数の ViewModel 間でデータを共有するにはどうすればよいですか?

たとえば、アプリケーションに Project という名前のクラスがあります。

    public class Project : ModelBase
{
    private string _projectName;

    public string ProjectName
    {
        get { return _projectName; }
        set
        {
            _projectName = value;
            RaisePropertyChanged(() => ProjectName);
        }
    }
}

複数の ViewModels アプリケーションでは、ActiveProject にアクセスする必要があります。
ViewModel 間で Project を共有する最良の方法は何ですか?

  • メディエーター パターン ? (メッセージ)
  • 静的オブジェクト
  • シングルトン パターン (ある場合、どのように?)

以前に Messaging を使用したことがありますが、多くのコーディングが必要です。すべての ViewModel について、ActiveProject プロパティを作成し、それを更新するためにメッセンジャーを登録する必要があります。


MVVM Light フレームワークを使用しています。
コード例をいただければ幸いです。

4

5 に答える 5

7

すべての Project ViewModel の親として機能する ViewModel を作成します。(ソリューションと呼びましょう)

Solution ViewModel には、プロパティ ActiveProject と監視可能なプロジェクトのコレクションがあります。

于 2013-05-13T21:14:49.880 に答える
3

しないでください。MVVM アプリケーションでこのようにシングルトンを使用しないでください。実際、Project クラスは ViewModel のモデルである必要があります。vm のコンストラクターに渡すだけです。Project クラスの 1 つのインスタンスを複数の vm で本当に共有する必要がある場合は、ビュー モデルを構築するときにファクトリとある種のキャッシュを使用します。VM にさらに情報が必要な場合は、Project から派生する (または IProject を実装する) 特別な Model クラスを作成するだけで、インターフェイス分離の原則を簡単に使用できます。

于 2015-10-21T17:48:48.427 に答える
1

新しいビューモデルに移動する前に、ビューモデルが設定する静的コレクションを持つことができます。その後、ターゲット ビュー モデルは、そのコンストラクター内からデータを取得できます。

たとえば、ViewModel1 (VM1) はプロジェクトを作成し、それを設定します。次に、VM1 はプロジェクトをシャードの静的なコレクションに入れます。その後、VM1 は別のビュー モデル (VM2) に移動します。VM2 のコンストラクターでは、コレクションに移動し、VM1 によってそこに配置されたプロジェクトを取得します。

キーと値のペアの辞書を使用すると、ビュー モデル間で他のデータを共有することもできます。

于 2013-05-13T21:02:05.400 に答える