これは長い質問になるだろうが、私は醜い大きなオールインワンクラスを構築することで、長い間この問題を回避してきた.
例として、私は MVVM 設計 (Caliburn.Micro も使用しています) で WPF スタンドアロン アプリケーションを作成してMainViewModelおり、MainView. このビューには が含まれておりStackPanel、このコンテンツはStackPanelViewModel にバインドされてい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;}
}
さて、MainViewModelI セットのコンストラクターで
CentralVM = LoginVM
そして、StackPanel自動的に View にバインドされますLoginView。はLoginViewあなたが推測することを行います。つまり、(ユーザー名、パスワード)を入力できます。エントリを評価するボタンがあり、それが正しい場合は、設定を に切り替えたいと思いCentralVMますLoggedInVM。しかし、ボタン イベントは のLoginVMインスタンスに「存在」しLoginViewModelます。CentralVMMainViewModel
もちろん、これは一般的な種類の問題の例にすぎません。私の最初のアイデアは、次のことを行うことでした。
-これには、ボタンがクリックされたときに設定される、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」への流行語の参照だけでなく、詳細な回答をいただければ幸いです-可能な解決策と関係があることは知っていますが、理解できる適切なドキュメントが見つかりません...