【问题标题】:How to implement dialog architecture in MVVM如何在 MVVM 中实现对话架构
【发布时间】:2013-02-11 12:24:24
【问题描述】:

我正在开发一个基于 PRISM 框架(Unity Container)的 WPF 4.0 - MVVM 应用程序。

我想知道在 mvvm 模式中实现对话框的最佳方式是什么。 我打算在我的应用程序中使用很多,所以我想要一些可重用的东西。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    由于您使用的是 Prism/Unity,因此请为您的视图模型实现中介者模式。

    1. 将 DialogService (IDialogService) 模块添加到您的项目中。
    2. 包含对话框的模块向 IDialogService 注册它们。 不要忘记将 DialogServiceModule 声明为 ModuleDependency。
    3. ViewModel 现在使用 IDialogService 来显示所需的对话框。

      public interface IDialogService
      {
          void    RegisterDialog  (string dialogID, Type type);
          bool?   ShowDialog      (string dialogID);
      }
      
      public class DialogService : IDialogService
      {
          private IUnityContainer       m_unityContainer;
          private DialogServiceRegistry m_dialogServiceRegistry;
      
          public DialogService(IUnityContainer unityContainer)
          {
              m_unityContainer = unityContainer;
              m_dialogServiceRegistry = new DialogServiceRegistry();
          }
      
          public void RegisterDialog(string dialogID, Type type)
          {
              m_dialogServiceRegistry.RegisterDialog(dialogID, type);
          }
      
          public bool? ShowDialog(string dialogID)
          {
              Type type = m_dialogServiceRegistry[dialogID];
              Window window  = m_unityContainer.Resolve(type) as Window;
              bool? dialogResult = window.ShowDialog();
      
              return dialogResult;
          }
      }
      

    如果您在视图中使用 ViewModel 事件和处理程序,请使用 Wea​​kEventHandler 模式来消除潜在的资源泄漏。 此外,可以将多个 View 附加到同一个 ViewModel。 我用一个 ViewModel -> 一个 View 处理过项目。但也有一个 ViewModel -> 多个 Views。 只是在做出设计决策时需要考虑的事情。

    【讨论】:

      【解决方案2】:

      这篇关于 MVVM 对话框的文章可能对您有用:http://www.codeproject.com/Articles/36745/Showing-Dialogs-When-Using-the-MVVM-Pattern

      【讨论】:

      • 感谢您的参考。我希望有一个使用行为或其他 WPF 4 功能的更优雅的实现..
      • @Omribitan - 你会这么想的,不是吗。这是 MVVM 和 WPF 的问题之一——你需要大量的 3rd 方库和/或代码才能让它去做认为这应该很简单。
      【解决方案3】:

      我让 ViewModel 在需要获取用户信息时引发事件。然后由 View 如何提供它。这确实意味着文件后面的代码将获得事件处理程序,但真正的 MVVM 专家会在...

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 2021-12-18
        • 2019-10-20
        • 2020-07-10
        • 2014-10-12
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多