【问题标题】:How to handle multiple windows and dialogs in MVVM?如何处理 MVVM 中的多个窗口和对话框?
【发布时间】:2013-03-17 06:09:37
【问题描述】:

有没有使用 MVVM 模式显示对话框窗口、打开和关闭它们以及从中检索数据的标准方法?

我看过这个:http://www.daedtech.com/mvvm-and-dialogs

我想用于显示特殊的对话框(视图/视图模型)。

MVVM中如何处理多个窗口和对话框?

【问题讨论】:

  • 我阅读了该链接,但奇怪的是作者如此强调如何打开一个窗口。在我看来,这是最琐碎的任务!只需创建一个新实例并调用 show 方法。我个人觉得困难在于将任何数据从第二个窗口重定向回原始视图模型,是的......关闭窗口而不隐藏代码。对于第一个问题,我将主视图模型的引用传递给 child 。第二个,我创建一个事件处理程序并在我打开子窗口时订阅它。
  • 使用 IoC 参考这个 - codeproject.com/Articles/36745/…
  • Ioc 对于他的具体情况来说太过分了。

标签: wpf mvvm


【解决方案1】:

thats 在 mvvm 中使用对话框时我会做什么:)

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

【讨论】:

  • 非常感谢,但是如何设置特殊视图模型的视图?
  • 查看链接,DataTemplates 是为您的特殊视图模型显示正确视图的关键
【解决方案2】:

我见过的针对这种情况的最佳解决方案是PRISM's Interaction Request(参见“使用交互请求对象”标题)。它是用于打开对话框的最 MVVM 友好的抽象。交互请求是视图模型,独立于控件和视图元素,可以绑定到特定的视图。

样品。 查看模型:

public IInteractionRequest ConfirmCancelInteractionRequest
{
    get
    {
        return this.confirmCancelInteractionRequest;
    }
}

this.confirmCancelInteractionRequest.Raise(
    new Confirmation("Are you sure you wish to cancel?"),
    confirmation =>
    {
        if (confirmation.Confirmed)
        {
            this.NavigateToQuestionnaireList();
        }
    });

查看:

<i:Interaction.Triggers>
    <prism:InteractionRequestTrigger 
            SourceObject="{Binding ConfirmCancelInteractionRequest}">

        <prism:PopupChildWindowAction
                  ContentTemplate="{StaticResource ConfirmWindowTemplate}"/>

    </prism:InteractionRequestTrigger>
</i:Interaction.Triggers>

<UserControl.Resources>
    <DataTemplate x:Key="ConfirmWindowTemplate">
        <Grid MinWidth="250" MinHeight="100">
            <TextBlock TextWrapping="Wrap" Grid.Row="0" Text="{Binding}"/>
        </Grid>
    </DataTemplate>
</UserControl.Resources>

Wpf PRISM 是 here

【讨论】:

  • 非常感谢,但我不想使用组件。
  • 根据您的需要创建您自己的简单组件。此示例演示了一个原理,您可以将其用作示例。 PRISM 也是开源的,因此您可以只将需要的类添加到您的项目中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多