我知道这个问题已经被问了很多次,但我会尽可能详细地说明。
我是WPF/MVVM的初学者,正在我的项目中使用Galasoft的MVVM Light Toolkit。
我有一个视图包含一个表单,用户输入一些患者信息。当他们点击关闭(X)按钮时,我想检查他们是否输入了内容,如果输入了内容,则询问他们在关闭前是否要保存(有、无和取消选项)。我做了一些研究,发现许多人建议使用EventToCommand功能,如下所示,
XAML
上面的例子取自使用MVVM light关闭窗口时的确认。
然而,MVVM Light Toolkit的创建者本人表示,这会破坏MVVM模式试图实现的关注点分离,因为它将属于视图(在这种情况下是
所以我的问题是,有什么正确的方法来处理这样的问题,而不会破坏MVVM模式。任何指向正确方向的观点都将不胜感激!
我是WPF/MVVM的初学者,正在我的项目中使用Galasoft的MVVM Light Toolkit。
我有一个视图包含一个表单,用户输入一些患者信息。当他们点击关闭(X)按钮时,我想检查他们是否输入了内容,如果输入了内容,则询问他们在关闭前是否要保存(有、无和取消选项)。我做了一些研究,发现许多人建议使用EventToCommand功能,如下所示,
XAML
<Window
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding OnClosingCommand}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
</Window>
视图模型
public class MainViewModel : ViewModelBase
{
public RelayCommand<CancelEventArgs> OnClosingCommand { get; set; }
public MainViewModel()
{
this.OnClosingCommand =
new RelayCommand<CancelEventArgs>(this.OnClosingCommandExecuted);
}
private void OnClosingCommandExecuted(CancelEventArgs cancelEventArgs)
{
// logic to check if view model has updated since it is loaded
if (mustCancelClosing)
{
cancelEventArgs.Cancel = true;
}
}
}
上面的例子取自使用MVVM light关闭窗口时的确认。
然而,MVVM Light Toolkit的创建者本人表示,这会破坏MVVM模式试图实现的关注点分离,因为它将属于视图(在这种情况下是
CancelEventArgs
)的事件参数传递给视图模型。他在这篇文章中提到了这一点http://blog.galasoft.ch/posts/2014/01/using-the-eventargsconverter-in-mvvm-light-and-why-is-there-no-eventtocommand-in-the-windows-8-1-version/。所以我的问题是,有什么正确的方法来处理这样的问题,而不会破坏MVVM模式。任何指向正确方向的观点都将不胜感激!
GetClosing
/SetClosing
只是常规的附加属性值包装器。已添加缺失的方法。 - Dennis