这是我当前的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();
}
...发布于 2013-02-15 00:00:49
太多的XAML代码隐藏是一种信号,表明您正在以某种方式打破MVVM模式。接收EventArgs的ViewModel也是一个禁忌。
为了打开/关闭对话框,我倾向于使用消息传递系统,例如,MVVM Light提供的系统。
对于消息传递系统(使用MVVM Light),您可以执行以下操作:
在您的ViewModel中:
private void SomeMethodThatNeedsToOpenADialog()
{
Messenger.Default.Send(new OpenDialogXMessage());
}在您的视图中:
Messenger.Default.Register<OpenDialogXMessage>(this, (msg) => {
new DialogX().ShowDialog();
});一些相关链接:
发布于 2013-02-15 00:09:19
它不是一个事件处理程序解决方案,但是Binding解决方案呢?不幸的是,当设置了该值时,您不能绑定Window.DialogResult,这会导致窗口关闭。但是,您可以创建一个AttachedProperty,它可以绑定到底层ViewModel上的属性,并在设置其值时设置不可绑定属性。AttachedProperty如下所示。
public class AttachedProperties
{
public static readonly DependencyProperty DialogResultProperty =
DependencyProperty.RegisterAttached("DialogResult", typeof (bool?), typeof (AttachedProperties), new PropertyMetadata(default(bool?), OnDialogResultChanged));
private static void OnDialogResultChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var wnd = d as Window;
if (wnd == null)
return;
wnd.DialogResult = (bool?) e.NewValue; //here the not bindable property is set and the windows is closed
}
public static bool? GetDialogResult(DependencyObject dp)
{
if (dp == null) throw new ArgumentNullException("dp");
return (bool?)dp.GetValue(DialogResultProperty);
}
public static void SetDialogResult(DependencyObject dp, object value)
{
if (dp == null) throw new ArgumentNullException("dp");
dp.SetValue(DialogResultProperty, value);
}
}AttachedProperty可以像这样使用
<Window x:Class="AC.Frontend.Controls.DialogControl.Dialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hlp="clr-namespace:AC.Frontend.Helper"
hlp:AttachedProperties.DialogResult="{Binding DialogResult}">
<!-- put your content here -->
</Window>现在,您可以使用Command设置VM的DialogResult属性,该属性是Window的DataContext。
https://stackoverflow.com/questions/14878614
复制相似问题