2013-02-11 47 views
7

我正在开发基于PRISM框架(Unity Container)的WPF 4.0 - MVVM应用程序。如何在MVVM中实现对话架构

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

回答

2

由于您使用Prism/Unity实现视图模型的中介模式。

  1. 将DialogService(IDialogService)模块添加到您的项目中。
  2. 包含对话框的模块使用IDialogService注册它们。 不要忘记将DialogServiceModule声明为ModuleDependency。
  3. ViewModels现在使用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; 
        } 
    } 
    

如果使用视图模型的事件处理程序&在视图中,使用WeakEventHandler模​​式,以消除潜在的资源泄漏。 此外,可以将多个视图附加到相同的ViewModel。 我已经使用一个ViewModel - >一个视图来处理项目。但也有一个ViewModel - >多个视图。 只是在做出设计决定时要考虑的事情。

2
+0

感谢您的参考。我跳跃有一个更优雅的实施使用行为或其他WPF 4功能.. – 2013-02-11 12:49:32

+0

@Omribitan - 你会这样想,不是吗。这是MVVM和WPF的问题之一 - 你需要大量的第三方库和/或代码才能让它认为它应该是非常简单的。 – Sean 2013-02-11 14:44:13

1

我让视图模型引发事件时,它需要获取用户信息。然后由View决定如何提供它。这确实意味着后面的代码将获得事件处理程序,但一些真正的MVVM娴熟会发抖...