我尝试了一些解决方案,例如将结束事件绑定到一个命令,该命令可以询问用户是否确定要取消,但无论用户选择了什么命令都返回取消仍在处理中。
我使用了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方法放入我的代码后面这样做?
答案 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>
或者这也是你想避免的事情?