这是我当前的App.xaml.cs
它看起来简单的一两个,但我有7-8个窗口。有没有一个聪明的方法,使这一点更普遍和更好?
public App()
{
_ViewModel = new MyAppViewModel();
_ViewModel.OpenXXXWindowEvent += new EventHandler(ViewModel_OpenXXXWindow);
_ViewModel.OpenYYYWindowEvent += new EventHandler(ViewModel_OpenYYYWindow);
...
}
private void ViewModel_OpenXXXWindow(object sender, EventArgs e)
{
_XXXWindow = new XXXWindow();
_XXXWindow.DataContext = _ViewModel;
_XXXWindow.ShowDialog();
}
private void ViewModel_CloseXXXWindow(object sender, EventArgs e)
{
if (_XXXWindow != null)
_XXXWindow.Close();
}
private void ViewModel_OpenYYYWindow(object sender, EventArgs e)
{
_YYYWindow = new YYYWindow();
_YYYWindow.DataContext = _ViewModel;
_YYYWindow.ShowDialog();
}
private void ViewModel_CloseYYYWindow(object sender, EventArgs e)
{
if (_YYYWindow != null)
_YYYWindow.Close();
}
...
2条答案
按热度按时间vnzz0bqm1#
太多的XAML代码隐藏是一个信号,表明您在某种程度上打破了MVVM模式。ViewModel接收EventArgs也是一个禁忌。
为了打开/关闭对话框,我倾向于使用消息传递系统,例如MVVM Light提供的消息传递系统。
使用消息传递系统(使用MVVM Light),您可以执行以下操作:
在视图模型中:
在您的视图中:
一些相关链接:
i7uaboj42#
这不是一个事件处理器的解决方案,但是
Binding
的解决方案怎么样?不幸的是,你不能绑定Window.DialogResult
,这会导致窗口在设置值时关闭。但是你可以创建一个AttachedProperty
,它可以绑定到底层ViewModel
上的一个属性,并在设置值时设置不可绑定的属性。AttachedProperty
看起来像这样。AttachedProperty
可以这样使用现在您可以使用
Command
设置VM的DialogResult
属性,该属性是Window
的DataContext
。