在WPF应用程序和MVVMLight Toolkit中,我想看看你的意见,如果我需要取消Window Close事件,最好的方法是什么。 在Window.Closing事件中,我可以设置e.Cancel = true,这可以防止关闭表单。要确定是否允许Close,或者应该阻止Close是在ViewModel上下文中。
如果我定义一个Application变量,可以解决一个问题,我可以在后面的视图代码中的普通事件处理程序中查询它吗?
感谢
答案 0 :(得分:15)
使用MVVM Light,您获得了EventToCommand
:
所以你可以在xaml中将关闭事件连接到VM。
<Window ...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:command="http://www.galasoft.ch/mvvmlight">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<command:EventToCommand Command="{Binding ClosingCommand}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
并在VM中:
public RelayCommand<CancelEventArgs> ClosingCommand { get; private set; }
ctor() {
ClosingCommand = new RelayCommand<CancelEventArgs>(args => args.Cancel = true);
}
如果您不想将CancelEventArgs
传递给虚拟机:
您总是可以使用Behavior
采用类似的方法,只需使用VM中的简单bool
(将此bool绑定到行为)以指示应取消关闭事件。
<强>更新强>
Download Link for following example
要使用Behavior
执行此操作,您可以拥有Behavior
,例如:
internal class CancelCloseWindowBehavior : Behavior<Window> {
public static readonly DependencyProperty CancelCloseProperty =
DependencyProperty.Register("CancelClose", typeof(bool),
typeof(CancelCloseWindowBehavior), new FrameworkPropertyMetadata(false));
public bool CancelClose {
get { return (bool) GetValue(CancelCloseProperty); }
set { SetValue(CancelCloseProperty, value); }
}
protected override void OnAttached() {
AssociatedObject.Closing += (sender, args) => args.Cancel = CancelClose;
}
}
现在在xaml:
<i:Interaction.Behaviors>
<local:CancelCloseWindowBehavior CancelClose="{Binding CancelClose}" />
</i:Interaction.Behaviors>
其中CancelClose
是来自VM的bool属性,指示是否应取消Closing
事件。在附带的示例中,我有Button
来从VM切换此bool,以便您测试Behavior
答案 1 :(得分:0)
您可以使用Messages
来控制它,例如:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Messenger.Default.Register<CloseApplicationMessage>(this, m => Close());
Loaded += MainWindowLoaded;
Closing += MainWindowClosing;
}
private void MainWindowClosing(object sender, CancelEventArgs e)
{
//Ask for saving
var closingMessage = new ClosingApplicationMessage();
Messenger.Default.Send(closingMessage);
if (closingMessage.Cancel)
e.Cancel = true;
}
...
mvvm消息:
public class ClosingApplicationMessage
{
public bool Cancel { get; set; }
}
通过这种方式,在您正在收听ClosingApplicationMessage
的任何地方,您可以控制应用程序何时关闭,并可以取消它。
希望这会有所帮助...