MVVMライトに関して次の質問があります:UIを「駆動」するものは何ですか?表示しているビューごとにViewModelを作成できるようです。ViewLocatorはすべてのViewModelを処理します(私が理解しているようにキャッシュ用)。しかし、UIを動かしているのは何ですか?
ViewModelに「ShowDetail」というコマンドが定義されている場合。このビューをViewModel内に表示するためのコードを記述する必要がありますか?
この例はありますか?ありがとう!
MVVMライトに関して次の質問があります:UIを「駆動」するものは何ですか?表示しているビューごとにViewModelを作成できるようです。ViewLocatorはすべてのViewModelを処理します(私が理解しているようにキャッシュ用)。しかし、UIを動かしているのは何ですか?
ViewModelに「ShowDetail」というコマンドが定義されている場合。このビューをViewModel内に表示するためのコードを記述する必要がありますか?
この例はありますか?ありがとう!
MVVM パターン自体には、ビュー間のナビゲーションに固有のものはありません。ただし、いくつかのフレームワークには、そのための多くのソリューションがあります。最も一般的な解決策は、メイン ビューを「調整」するある種のコントローラーを使用するか、サブビューに「マスター/ディテール」アプローチを使用することです。
いくつかの興味深い解決策:
コードを生成し、URIまたはオブジェクトに移動する方法、またはウィンドウ(wpf)を閉じる方法を示すT4テンプレートを作成しました。mvvmlightで動作します
MVVM では、ビューを "駆動" するのはデータ バインディングです。ビューの DataContext をビュー モデルを指すように設定することで、ビューをビューモデルに接続できます。
簡単な例 (MVVM Light を使用):
MyViewModel.cs
public class MyViewModel : ViewModelBase
{
(...)
private string _myProperty;
public string MyProperty {
get { return _myProperty; }
set {
_myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
}
MyView.xaml.cs
void MyView() {
DataContext = new MyViewModel();
}
MyView.xaml
<TextBlock Text="{Binding MyProperty}" />
MVVM ライト ツールキットのメッセージング システムについて読むことをお勧めします。これは、これを達成するために私が見つけた最も簡単なアプローチのようです。これがどのように機能するかの例を次に示します。
2 つのビュー モデルがある場合 - 1 つは顧客の検索用、もう 1 つは選択した顧客に関する詳細の表示用です。
最初のビュー モデルには、次のようなプロパティがあります。
public string CustomerID
{
get
{
return _customerid;
}
set
{
if (_efolderid == value)
{
return;
}
var oldValue = _customerid;
_customerid = value;
// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
RaisePropertyChanged("CustomerID", oldValue, value, true);
}
}
次に、2 番目のビュー モデルで、次のように、この値が他の値から変更されたときにメッセージを受信するように登録します。
void registerForMessages()
{
Messenger.Default.Register<PropertyChangedMessage<string>>(this,
(pcm) =>
{
if (pcm.PropertyName == "CustomerID")
{
customerID = pcm.NewValue;
AddWorkplanCommand.RaiseCanExecuteChanged();
loadCustomerDetails();
}
});
}
2 番目のビュー モデルのコンストラクターで registerForMessages() 関数を呼び出すようにしてください。アプリケーションに 4 つ以上の ViewModel がある場合に役立つもう 1 つの方法は、ある種のマップを作成することです。すべてのメッセージとその目的、およびそれらを受信するために登録されている他のビューモデルを追跡するために、ソリューションのクイックテキストファイルで簡単に作成できることがわかりました。
これに関する非常に優れた点の 1 つは、1 つのビューモデルが customerID プロパティの変更などの変更通知を送信し、すぐに他の 4 つのビューモデルがその変更を受け取り、すべてのビューモデルが変更の読み込みを開始することです。
Cinch V2をチェックできると思います:
http://www.codeproject.com/KB/WPF/CinchV2_1.aspx
これは静かに有望に思えます。しかし、これらのフレームワークのほとんどはかなり難しいと思います。
ビューとビューモデル間の通信を処理する、ある種の監視コントローラー パターンを使用した単純な MVVM アプローチでソリューションを実装しました。