在WPF的MVVM模式中,处理对话框是比较复杂的操作之一.由于您的视图模型不了解视图的任何信息,因此对话交流可能会很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.

有谁知道处理对话结果的好方法吗?我说的是像MessageBox这样的窗口对话框.

我们这样做的方法之一是在viewmodel上有一个事件,当需要一个对话框时,视图将订阅该事件.

public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;

这没关系,但这意味着视图需要代码,这是我不想看到的.

推荐答案

我建议放弃20世纪90年代的模态对话框,而是将控件实现为覆盖(画布+绝对定位),可见性与VM中的布尔值绑定.更接近ajax类型的控件.

这非常有用:

<BooleanToVisibilityConverter x:Key="booltoVis" />

如下所示:

<my:ErrorControl Visibility="{Binding Path=ThereWasAnError, Mode=TwoWay, Converter={StaticResource booltoVis}, UpdateSourceTrigger=PropertyChanged}"/>

下面是我如何将一个实现为用户控件的方法.单击"x"将关闭用户控件代码后面的一行代码中的控件.(因为我在.exe中有视图,在DLL中有ViewModel,所以我对操作UI的代码并不感到难受.)

Wpf dialog

.net相关问答推荐

API响应返回null错误. NET MAUI

为什么Linq中的运算符逻辑不匹配结果,当值为0或在VB. NET中没有

ASP.NET核心最小API必须以正斜杠开头吗?

获取Ef-Core集合的DeleteBehavior

使用 PostAsJsonAsync C# 时出现错误请求

如何确定计时器是否正在运行?

如何获得友好的操作系统版本名称?

为什么我得到 411 Length required 错误?

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

有什么方法可以在不重新编译的情况下覆盖 .NET Windows 服务名称?

DateTime.TryParseExact() 拒绝有效格式

Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?

什么是 C# 中的自动属性,它们的用途是什么?

从 C# 中的字符串中删除最后一个字符.优雅的方式?

如何在安装后立即启动 .NET Windows 服务?

WebClient.DownloadString 由于编码问题导致字符损坏,但浏览器正常

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

表单不响应 KeyDown 事件

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

App.config:用户与应用程序范围