これは長い質問になるだろうが、私は醜い大きなオールインワンクラスを構築することで、長い間この問題を回避してきた.
例として、私は MVVM 設計 (Caliburn.Micro も使用しています) で WPF スタンドアロン アプリケーションを作成してMainViewModel
おり、MainView
. このビューには が含まれておりStackPanel
、このコンテンツはStackPanel
ViewModel にバインドされていCentralVM
ます。
<StackPanel DockPanel.Dock="Top">
<ContentControl Margin="10" Name="CentralVM"/>
</StackPanel>
クラスにはMainViewModel
、他にもいくつかの ViewModel があります。
private PropertyChangedBase _centralVM = new PropertyChangedBase();
private LoggedInViewModel _loggedInVM = new LoggedInViewModel();
private LoginViewModel _logInVM = new LoginViewModel();
public PropertyChangedBase CentralVM {
get { return _centralVM; }
set { _centralVM = value; NotifyOfPropertyChange(() => CentralVM); }
}
public LoggedInViewModel LoggedInVM {
get { return _loggedInVM; }
private set { _loggedInVM = value; }
}
public LoginViewModel LoginVM {
get { return _logInVM; }
private set { _loginVM = value;}
}
さて、MainViewModel
I セットのコンストラクターで
CentralVM = LoginVM
そして、StackPanel
自動的に View にバインドされますLoginView
。はLoginView
あなたが推測することを行います。つまり、(ユーザー名、パスワード)を入力できます。エントリを評価するボタンがあり、それが正しい場合は、設定を に切り替えたいと思いCentralVM
ますLoggedInVM
。しかし、ボタン イベントは のLoginVM
インスタンスに「存在」しLoginViewModel
ます。CentralVM
MainViewModel
もちろん、これは一般的な種類の問題の例にすぎません。私の最初のアイデアは、次のことを行うことでした。
-これには、ボタンがクリックされたときに設定される、LoginVM
呼び出される (文字列型の) プロパティが含まれます。-次のようLoggedInAs
に、にメソッドを追加します。MainViewModel
private _loggedIn = false;
private void CheckForLoginChange() {
if (_loggedIn == false && !String.IsNullOrEmpty(LoginVM.LoggedInAs)) {
_loggedIn = true;
CentralVM = LoggedInVM;
}
}
-最後に、このメソッド呼び出しを のセッターに追加しますLoginVM
。つまり、
public LoginViewModel LoginVM {
get { return _logInVM; }
private set { _logInVM = value; CheckForLoginChange(); }
}
しかし、これはうまくいきません。LoginVM
ボタンイベントがクリックされると変化するのですが、セッターが呼ばれていないからでしょうか?
この方向での助けに感謝します。「EventAggregators」または「Messenger」への流行語の参照だけでなく、詳細な回答をいただければ幸いです-可能な解決策と関係があることは知っていますが、理解できる適切なドキュメントが見つかりません...