使用MVVM处理WPF中的对话框

在WPF的MVVM模式中,处理对话框是更复杂的操作之一。 由于您的视图模型不知道视图的任何内容,对话框通信可能很有趣。 我可以公开一个ICommand,当视图调用它时,会出现一个对话框。

有谁知道处理对话结果的好方法吗? 我正在谈论诸如MessageBox之类的Windows对话框。

我们做这件事的方式之一是在视图模型上有一个事件,当需要对话时视图会订阅。

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'关闭后面的usercontrol代码中的一行代码中的控件。 (因为我在DLL中的.exe和ViewModels中有我的视图,所以我不会为操纵UI的代码感到不快。)

Wpf对话框


你应该为此使用中介。 Mediator是一种常见的设计模式,在其一些实现中也称为Messenger。 这是一个Register / Notify类型的范例,可以使您的ViewModel和Views通过低耦合的消息机制进行通信。

你应该看看谷歌WPF门徒小组,只是搜索调解员。 你会很满意答案...

但是,您可以从这开始:

http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator-prototype-for-wpf-apps/

请享用 !

编辑:你可以在MVVM Light Toolkit中看到这个问题的答案:

http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338


一个好的MVVM对话框应该:

  • 只用XAML声明。
  • 从数据绑定中获取所有的行为。
  • 不幸的是,WPF不提供这些功能。 显示对话框需要对ShowDialog()进行代码隐藏调用。 支持对话框的Window类不能在XAML中声明,因此它不容易被数据绑定到DataContext。

    为了解决这个问题,我编写了一个位于逻辑树中的XAML存根控件,并将数据绑定转发给Window,并处理显示和隐藏对话框。 你可以在这里找到它:http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

    这实际上只是简单地使用,并且不需要任何奇怪的变化到您的ViewModel,并且不需要事件或消息。 基本调用如下所示:

    <dialog:Dialog Content="{Binding Path=DialogViewModel}" Showing="True" />
    

    您可能想要添加设置显示的样式。 我在我的文章中解释它。 我希望这可以帮助你。

    链接地址: http://www.djcxy.com/p/9591.html

    上一篇: Handling Dialogs in WPF with MVVM

    下一篇: How is each process pinned to a specific core by scheduler (Linux)