gpt4 book ai didi

WPF MVVM 取消 Window.Closing 事件

转载 作者:行者123 更新时间:2023-12-04 10:07:27 25 4
gpt4 key购买 nike

在 WPF 应用程序和 MVVMLight Toolkit 中,我想看看你的意见,如果我需要取消 Window Close 事件,最好的实现方法是什么。
在 Window.Closing 事件中,我可以设置 e.Cancel = true,以防止关闭表单。在 ViewModel 上下文中确定是否允许关闭或应该阻止关闭。

一种解决方案可能是如果我定义一个应用程序变量,我可以在普通事件处理程序中的 View 代码中查询它?

谢谢

最佳答案

使用 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>

在虚拟机中:
public RelayCommand<CancelEventArgs> ClosingCommand { get; private set; }

ctor() {
ClosingCommand = new RelayCommand<CancelEventArgs>(args => args.Cancel = true);
}

如果不想通过CancelEventArgs到虚拟机 :

您总是可以使用 Behavior 的类似方法。只需使用简单的 bool从 VM(将此 bool 绑定(bind)到 Behavior)指示应取消关闭事件。

更新:

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

关于WPF MVVM 取消 Window.Closing 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com