【问题标题】:MVVM ViewModel and static methodsMVVM ViewModel 和静态方法
【发布时间】:2010-10-26 11:22:24
【问题描述】:

我尝试使用 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();
    }}

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

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

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

或者像这样将对象作为参数传递给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 模式?

提前致谢。

【问题讨论】:

    标签: c# wpf mvvm static


    【解决方案1】:

    如何显示对话框是 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 中删除任何显式引用。

    【讨论】:

    • IDialogService 或 IMessageBoxService 是我看到解决此问题的最常见方法。它也是可测试的。 +1
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多