在 WPF 的 MVVM 模式中,处理对话框是更复杂的操作之一。由于您的视图模型对视图一无所知,因此对话通信可能很有趣。我可以公开一个ICommand,当视图调用它时,会出现一个对话框。
ICommand
有谁知道处理对话结果的好方法?我说的是 Windows 对话框,例如MessageBox.
MessageBox
我们这样做的一种方法是在视图模型上设置一个事件,当需要对话框时视图将订阅该事件。
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
这没关系,但这意味着视图需要代码,这是我想远离的。
我建议放弃 1990 年代的模态对话框,而是将控件实现为覆盖(画布+绝对定位),其可见性与 VM 中的布尔值相关联。更接近 ajax 类型的控件。
这非常有用:
<BooleanToVisibilityConverter x:Key="booltoVis" />
如:
<my:ErrorControl Visibility="{Binding Path=ThereWasAnError, Mode=TwoWay, Converter={StaticResource booltoVis}, UpdateSourceTrigger=PropertyChanged}"/>
这是我如何将一个实现为用户控件的方法。点击’x’会在usercontrol的代码后面的一行代码中关闭控件。(因为我的视图在 .exe 中,视图模型在 dll 中,所以我对操纵 UI 的代码并不感到难过。)