覆盖关闭命令

时间:2018-02-20 08:29:11

标签: wpf mvvm

我尝试了一些解决方案,例如将结束事件绑定到一个命令,该命令可以询问用户是否确定要取消,但无论用户选择了什么命令都返回取消仍在处理中。

我使用了blend来创建一个事件触发器,它使用CallMethodAction在我的视图模型中调用Close方法,我似乎无法从整体关闭窗口停止。

是否可以不使用MVVM灯根据用户选择取消结束事件?

我尝试过的代码示例;

使用混合事件触发器:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Closing">
        <ci:CallMethodAction MethodName="CloseView" />
    </i:EventTrigger>
</i:Interaction.Triggers>

CloseView的代码只是我的viewmodel基类的虚拟空白,但我找不到任何方法来停止事件处理。

另一方面,我有点想避免的是这里的答案How to cancel window closing in MVVM WPF application

这涉及将cancel命令放在视图后面的代码中,我视图的datacontext设置为viewmodel但是在使用代码时

<Window
    ...
    x:Class="MyApp.MyView"
    Closing="OnClosing"
    ...
/>
</Window>

我得到一个XMLParse异常,它无法找到OnClosing方法,这可能是因为它正在查看视图背后的代码。

有没有其他方法可以在不将OnClosing方法放入我的代码后面这样做?

1 个答案:

答案 0 :(得分:1)

你想要避免任何代码吗?或者你只是不想在你的视图代码中使用代码?

你可以写一个行为:

public class WindowClosingBehavior: Behavior<Window>
{
    protected override void OnAttached()
    {
        this.AssociatedObject.Closing += AssociatedObject_Closing;
        base.OnAttached();
    }

    private void AssociatedObject_Closing(object sender, CancelEventArgs e)
    {
        //are you sure blabla code
        e.Cancel = true;
    }
}

并将其附加到您的窗口:

<Window x:Class="WpfApplication14.MainWindow"  
xmlns:Local="clr-namespace:WpfApplication14"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Title="MainWindow" Height="350" Width="525" >
    <i:Interaction.Behaviors>
        <Local:WindowClosingBehavior></Local:WindowClosingBehavior>
    </i:Interaction.Behaviors>
</Window>

或者这也是你想避免的事情?