MVVM ViewModel和静态方法

chi*_*ler 5 c# wpf static mvvm

我尝试使用MVVM模式重写我的应用程序.

我有一个窗口,用静态方法显示不同对象的相关文档,如下所示:

    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();
    }}
Run Code Online (Sandbox Code Playgroud)

有没有办法让这些方法像这样保持静态?

ShowRelatedDocumentsVM.ShowRelatedDocument(A objA);
ShowRelatedDocumentsVM.ShowRelatedDocument(B objB);
Run Code Online (Sandbox Code Playgroud)

我没有找到任何有关ViewModels和静态方法的信息.VM可以创建自己的实例并显示他的View(这里是一个窗口)吗?

或者是将对象作为参数传递给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();
}
Run Code Online (Sandbox Code Playgroud)

或两者都错了,因为我在视图模型中创建了视图而违反了MVVM模式?

Thx提前.

Ste*_*rex 4

如何显示对话框是 MVVM 目前尚不清楚的领域之一,有多种方法可以实现该行为。

我建议使用中介(如此处所述或通过注入对控制对话框的视图模型的依赖关系:

interface IDialogService
{
    void ShowRelatedDocumentsA(A a);
}
Run Code Online (Sandbox Code Playgroud)

...

class MyViewModel
{
    private IDialogService _dialogService

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

    public void DoSomething()
    {
        _dialogService.ShowDialog(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

其中任何一个都将允许您控制视图模型外部视图的创建,并将从 VM -> V 中删除任何显式引用。