2

私はそれを正しくやっているかどうか知りたいだけです。ビューモデル(MainWindowViewModel)を含むメインビュー(MainView)があります。MainViewには、別のビュー(SubView)を呼び出すためのボタンがあります。SubViewにはViewModel(SubViewModel)もあります。SubViewがそのviewmodelを介して閉じられた後、mainviewmodelからsubviewmodelのプロパティにアクセスしたいと思います。mainviewmodelからサブビューを呼び出してプロパティにアクセスするためのコードは次のようになります。

private void SubViewExecute(object parameter)
{
    SubView sub = new SubView();
    bool? result = sub .ShowDialog();
    if (!result.HasValue || !result.Value) return;
    if (sub.DataContext is SubViewModel)
    {
        SubViewModel subViewModel = (sub.DataContext as SubViewModel);
        string property = subViewModel.Property;
    }
}

私はmvvm-patternを正しく実行していますか、それとも私が欲しいものを達成するためのより良い方法はありますか?

4

2 に答える 2

3

ここで何が必要かは完全には明確ではありませんが、これは純粋な意味でMVVMに間違いなく違反しています。

この例では、ビューレイヤーMainViewModelSubView)を直接知っている必要があります。これは通常、可能な限り回避されます。

ただし、これを回避するための最善のアプローチは、フレームワークを使用しているかどうか(多くのフレームワークには、ビューをViewModelに一致させたり、ダイアログを表示したりするためのツールがあります)、どのフレームワークを使用しているか、およびViewを使用しているかどうかによって大きく異なります。最初またはViewModel-最初。

于 2013-01-29T20:06:21.307 に答える
3

あなたの中心的な質問に対して:「私はmvvm-patternを正しくやっていますか、それとも欲しいものを達成するためのより良い方法はありますか?」

いいえ、あなたはMVVMの核となる原則を正しく守っていません。あなたが望むものを達成するためのより良い方法があります(あなたが何を望んでいるのかを正しく理解していれば)。

まず、MVVM は、"上の" レイヤーの知識を必要とせずに、すべてのレイヤーをテスト可能にする必要があることから生まれました。たとえば、アプリケーションは、モデルだけで想定されているすべてのことを技術的に実行できる必要があります。必要に応じてデータを取得、更新、作成できる必要があります。たとえこのデータがユーザーの直感的な方法で表示されていなくてもです。

第 2 に、アプリケーションは、View-Model を介してユーザーが実行したいすべてのことを技術的に実行できる必要がありますが、いかなる種類の UI も必要ありません。したがって、データを「見て」、保存などのさまざまなプログラム機能を実行できる必要があります。

次に、ビューを一番上に投げると、必要なのはデータバインディングとイベント処理だけで、準備完了です! (多くの場合)...

主に、ViewModel から独自の DataContext を正しく管理するのは View の責任です。データコンテキストを特定のビューにプッシュするのはビューモデルの仕事ではありません。別の見方をすると、View は ViewModel のメソッドとプロパティにアクセスして、ユーザー インターフェイスでユーザーが要求した作業を実行します。

そのため、コードを反転することから始めます。これにより、View はいつでもどのビューをアクティブにするかを制御し、各ビューは独自のデータ コンテキストとそれらを利用する方法を認識します。

(さて、SO コミュニティが VM ファースト アプローチについて何も言わないことについて私に飛びつく前に、ここにあります。VM ファースト アプローチを試すこともできますが、最初は理解するのがより難しく、使用したいと思うでしょう。 Caliburn.Micro や MVVMLite など、あなたを助けるフレームワーク)

したがって、View First の場合、必要なことは、MainView に SubView を自分自身に取り込む方法を認識させることです。各 SubView は MainView で作成されるため、データ コンテキストが正しい MainViewModel であることを確認するのは MainView の仕事です。

MainViewModel には (さまざまな種類の) SubViewModels のセットが既に含まれているため、これは論理的に簡単にアプローチできるはずです。

より具体的なコードに関する質問 (サンプル コード付き) がある場合は、さらにお役に立てば幸いです。

于 2013-01-29T20:41:41.933 に答える