2010-10-26 79 views
3

我尝试使用MVVM模式重写我的应用程序。MVVM ViewModel和静态方法

我有一个窗口,显示与静态方法类似这样的不同对象相关文件:

public partial class ShowRelatedDocuments : Window 
    { 

    private ShowRelatedDocuments() 
    { 
     InitializeComponent(); 
    } 

    public static void ShowRelatedDocument(A objA) 
    { 
     ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
     srd.HandleA(objA); 
     srd.ShowDialog(); 
    } 

    public static void ShowRelatedDocument(B objB) 
    { 
     ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
     srd.HandleB(objB); 
     srd.ShowDialog(); 
    }} 

有没有办法让这些方法静态这样吗?

ShowRelatedDocumentsVM.ShowRelatedDocument(A objA); 
ShowRelatedDocumentsVM.ShowRelatedDocument(B objB); 

我没有找到关于ViewModels和静态方法的任何信息。虚拟机可以创建自己的实例并显示其视图(这里是一个窗口)?

或者是更好的方式将对象作为参数传递给VM的构造函数吗?

public ShowRelatedDocumentsVM(A objA) 
{ 
    HandleA(obj A) 
    ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
    srd.DataContext = this; 
    srd.ShowDialog(); 
} 

public ShowRelatedDocumentsVM(B objB) 
{ 
    HandleB(objB); 
    ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
    srd.DataContext = this; 
    srd.ShowDialog(); 
} 

或者是双向的错,因为我违反创建在视图模型视图由于MVVM模式?

Thx提前。

回答

2

如何显示对话框是MVVM的一个不立即清理的领域之一,并且有许多方法可以实现行为。

我建议使用一个介体(如所描述的here)或通过在其控制对话视图模型注入依赖性:

interface IDialogService 
{ 
    void ShowRelatedDocumentsA(A a); 
} 

...

class MyViewModel 
{ 
    private IDialogService _dialogService 

    public MyViewModel(IDialogService dialogService) { _dialogService = dialogService; } 

    public void DoSomething() 
    { 
     _dialogService.ShowDialog(...); 
    } 
} 
无论是哪种

可以将允许您控制在视图模型之外创建视图,并将删除VM - > V的任何明确引用。

+0

IDialogService或IMessageBoxSer恶习是我见过这个问题解决的最常见的方式。它也是可测试的。 +1 – 2010-10-26 12:49:57