Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVVM ViewModel and static methods

Tags:

c#

static

mvvm

wpf

I try to rewrite my Application using the MVVM pattern.

I have a window to show related documents for different objects with static methods like this:

    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();
    }}

Is there a way to keep these methods static like this?

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

I didn't find anything about ViewModels and static methods. Can a VM create a instance of itself and show his View (here a window)?

Or is the better way to pass the objects as parameter to the constructor of the VM like this?

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();
}

Or are both ways wrong, cause i breach the MVVM pattern due creating the view in the viewmodel?

Thx in advance.

like image 688
chiller Avatar asked Oct 13 '22 22:10

chiller


1 Answers

How to display dialogs is one of the areas of MVVM that is not immediately clear, and there are a number of ways the behaviour can be achieved.

I would suggest using either a mediator (as described here) or by injecting a dependency on the view model that controls dialogs:

interface IDialogService
{
    void ShowRelatedDocumentsA(A a);
}

...

class MyViewModel
{
    private IDialogService _dialogService

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

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

Either of these can will permit you to control the creation of the view outside of the view model, and will remove any explicit references from VM -> V.

like image 111
Steve Greatrex Avatar answered Nov 02 '22 23:11

Steve Greatrex