MVVM ViewModel и статические методы

Я пытаюсь переписать свое приложение, используя шаблон 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);

Я ничего не нашел о ViewModels и статических методах. Может ли виртуальная машина создать свой экземпляр и показать его представление (здесь - окно)?

Или это лучший способ передать объекты в качестве параметра конструктору виртуальной машины следующим образом?

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 из-за создания представления в модели просмотра?

Спасибо заранее.


person chiller    schedule 26.10.2010    source источник


Ответы (1)


Как отображать диалоги - одна из областей MVVM, которая не сразу понятна, и есть несколько способов добиться такого поведения.

Я бы предложил использовать либо посредника (как описано здесь), либо путем введения зависимость от модели представления, которая управляет диалогами:

interface IDialogService
{
    void ShowRelatedDocumentsA(A a);
}

...

class MyViewModel
{
    private IDialogService _dialogService

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

    public void DoSomething()
    {
        _dialogService.ShowDialog(...);
    }
}

Любой из них позволит вам управлять созданием представления вне модели представления и удалит любые явные ссылки из VM -> V.

person Steve Greatrex    schedule 26.10.2010
comment
IDialogService или IMessageBoxService - это наиболее распространенный способ решения этой проблемы. Это также можно проверить. +1 - person Chris Holmes; 26.10.2010