1

ビューとビューの概念を誤解していたに違いありませんViewModels。しかし、現時点では、アプリケーションをゼロから再構築することはできず、今回はそれを改善しています。私の状況では、ユーザーがファイルをロードして読み取ることができるビューがあり、プロッターがグラフを表示し、いくつかの操作が実装されています。データのレポート (概要など) を生成できるようにしたいのですが、別のビューで表示したいのです。私はModernUIを使用しています。この他のビューは別のタブにあります。

私が望むのは、2 つのタブを同期させることです。「プロッタ タブ」にファイルをロードすると、そのファイルは他のビューにもロードする必要があります。そのために必要なのは、ビューを同じ にバインドすることだと思います。ViewModelたとえばLoadedFiles = List<File>、 があるので、それを達成することができます。問題は、どちらかをバインドすると

MainViewModel vm = new MainViewModel();
DataContext = vm;

またはXAMLで

<UserControl.Resources>
<UserControl.DataContext=local:MainViewModel/>
</UserControl.Resources>

私は実際にさまざまな MainViewModels にバインドしていますが、データはもう共有されていません。Locator などの MVVM ライブラリのいくつかのクラスが必要ですか? これはどのように行うことができますか?ビューごとに個別の ViewModel を使用するが、データは同じ (または異なる) ようにするために、将来何ができますか?

4

3 に答える 3

1

LoadedFiles プロパティを持つ新しいクラスを作成すると、一意の各ビュー モデルがこのクラスを参照できます。これらの共有プロパティを持つ 1 つのクラスを複数のビュー モデル間で共有できます。Autofac コンテナーで MVVMLight の Locator を使用して、このクラスを各ビュー モデルに挿入しています (基本的には、制御の反転と依存性注入を使用しています)。

Inversion of Control と Dependency Injection については、こちらを参照してください。

いくつかのサンプルコード -

public MyClass
{
    public List<File> LoadedFiles{get; set;}
}

public ViewModelOne
{
    public MyClass MyClassInstance {get; set;}
    public ViewModelOne(MyClass myclass)
    {
        MyClassInstance = myclass
    }
}

public ViewModelTwo
{
    public MyClass MyClassInstance {get; set;}
    public ViewModelTwo(MyClass myclass)
    {
        MyClassInstance = myclass
    }
}

MVVMLight の Locatorを使用して、各ビューの DataContext を適切なビューに設定することもできます。

<UserControl x:Class="View1"             
             DataContext="{Binding ViewModel1, Source={StaticResource Locator}}"...>
于 2013-07-09T22:26:25.447 に答える
0

両方のビューが同じビューモデルを共有する必要があるかどうかを自問する必要がありますか? ビューモデルで同じプロパティを共有していますか、それとも異なるプロパティを持っていますか? それらが同じビューモデルを共有する必要がある場合は、ロケーターを使用してロケーターからビューモデルを作成し、ロケーターをビューに渡す必要があります。それ以外の場合は、2 つのビューモデルが必要です。ビューモデル間のカップリングを最小限に抑えるために、両方のビューモデルで認識されているサービスを使用する必要があります(インターフェースを介したほうがよい)。1 つのビューモデルは実行されたアクションについてサービスに通知し、2 番目のビューモデルはそのアクションを処理します (イベントへの登録により)

幸運を、

M・モシェ

于 2013-07-09T21:29:17.690 に答える
0

VM を親 VM のプロパティに格納し、ContentPresenters異なるContentTemplates(それぞれのビューを含む) を使用してプロパティを 2 つにバインドします。

于 2013-07-09T20:46:28.830 に答える