【发布时间】:2013-02-13 07:45:39
【问题描述】:
这将是一个冗长的问题,但长期以来我一直在通过构建丑陋的大型一体化课程来回避这个问题。
例如,我正在编写一个带有 MVVM 设计的 WPF 独立应用程序(我也在使用 Caliburn.Micro),并且有一个 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 的构造函数中
CentralVM = LoginVM
然后StackPanel 会自动绑定到视图LoginView。 LoginView 会按照您的猜测进行,即您可以输入(用户名,密码),并且有一个评估条目的按钮,如果正确,我想将CentralVM 设置为LoggedInVM。但是按钮事件“存在”在LoginViewModel 的LoginVM 实例中,那么如何访问MainViewModel 中的属性CentralVM?
这当然只是一般问题的一个例子。我的第一个想法是执行以下操作:
-LoginVM 包含一个名为LoggedInAs 的属性(字符串类型),该属性在单击按钮时设置。
-我给MainViewModel添加一个方法,像这样:
private _loggedIn = false;
private void CheckForLoginChange() {
if (_loggedIn == false && !String.IsNullOrEmpty(LoginVM.LoggedInAs)) {
_loggedIn = true;
CentralVM = LoggedInVM;
}
}
-最后,我将这个方法调用添加到LoginVM的setter中,即
public LoginViewModel LoginVM {
get { return _logInVM; }
private set { _logInVM = value; CheckForLoginChange(); }
}
但这不起作用。是不是因为虽然点击按钮事件时LoginVM发生了变化,但是没有调用setter?
感谢您在这方面的任何帮助。我非常感谢一个详细的答案,而不仅仅是一些对“EventAggregators”或“Messengers”的流行语引用——我知道它们与可能的解决方案有关,但我还没有找到我能理解的好的文档......
【问题讨论】:
-
我不完全明白,但是为什么您不使用命令来单击按钮?
-
因为我认为没有理由这样做,所以 Caliburn.Micro 会自动将 Button 连接到与该按钮同名的方法。在这里使用命令有什么好处?它不能解决我的问题,还是?
-
好吧,我只是不熟悉 caliburn
标签: c# wpf mvvm caliburn.micro