gpt4 book ai didi

c# - 如何在 MVVM WPF 应用程序中取消窗口关闭

转载 作者:可可西里 更新时间:2023-11-01 09:10:49 31 4
gpt4 key购买 nike

单击“取消”按钮(或右上角的“X”或“Esc”)后如何取消退出特定表单?

WPF:

<Window
...
x:Class="MyApp.MyView"
...
/>
<Button Content="Cancel" Command="{Binding CancelCommand}" IsCancel="True"/>
</Window>

View 模型:

public class MyViewModel : Screen {
private CancelCommand cancelCommand;
public CancelCommand CancelCommand {
get { return cancelCommand; }
}
public MyViewModel() {
cancelCommand = new CancelCommand(this);
}
}

public class CancelCommand : ICommand {

public CancelCommand(MyViewModel viewModel) {
this.viewModel = viewModel;
}

public override void Execute(object parameter) {
if (true) { // here is a real condition
MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
"Really close?", "Warning",
System.Windows.MessageBoxButton.YesNo);
if (messageBoxResult == MessageBoxResult.No) { return; }
}
viewModel.TryClose(false);
}

public override bool CanExecute(object parameter) {
return true;
}
}

当前代码无效。如果用户在弹出对话框中选择“否”,我希望用户留在当前表单上。此外,覆盖 CanExecute 也无济于事。它只是禁用按钮。我想让用户点击按钮,但随后通知他/她,数据将会丢失。也许我应该在按钮上分配一个事件监听器?

编辑:

我设法在“取消”按钮上显示弹出窗口。但我仍然无法管理 Esc 或 X 按钮(右上角)。看来我对取消按钮感到困惑,因为当我单击 X 按钮或 Esc 时执行 Execute 方法。

编辑2:

我改变了问题。这是“如何取消取消按钮”。但是,这不是我想要的。我需要取消 Esc 或 X 按钮。在“MyViewModel”中,我添加:

        protected override void OnViewAttached(object view, object context) {
base.OnViewAttached(view, context);
(view as MyView).Closing += MyViewModel_Closing;
}

void MyViewModel_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
if (true) {
MessageBoxResult messageBoxResult = System.Windows.MessageBox.Show(
"Really close?", "Warning",
System.Windows.MessageBoxButton.YesNo);
if (messageBoxResult == MessageBoxResult.No) {
e.Cancel = true;
}
}
}

这解决了我的问题。但是,我需要 ICommand 了解单击了哪个按钮,保存或取消。有什么方法可以消除事件的使用吗?

最佳答案

您正在尝试在 ViewModel 类中执行 View 的工作。让您的 View 类处理关闭请求以及是否应取消。

要取消关闭窗口,您可以订阅 View 的 Closing 事件,并在显示 MessageBox 后将 CancelEventArgs.Cancel 设置为 true .

这是一个例子:

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

代码隐藏:

private void OnClosing(object sender, CancelEventArgs e)
{
var result = MessageBox.Show("Really close?", "Warning", MessageBoxButton.YesNo);
if (result != MessageBoxResult.Yes)
{
e.Cancel = true;
}

// OR, if triggering dialog via view-model:

bool shouldClose = ((MyViewModel) DataContext).TryClose();
if(!shouldClose)
{
e.Cancel = true;
}
}

关于c# - 如何在 MVVM WPF 应用程序中取消窗口关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36129372/

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