Search code examples
wpfmvvmvisibilitymediaelement

MVVM pattern violation: MediaElement.Play()


I understand that ViewModel shouldn't have any knowledge of View, but how can I call MediaElement.Play() method from ViewModel, other than having a reference to View (or directly to MediaElement) in ViewModel?
Other (linked) question: how can I manage View's controls visibility from ViewModel without violating MVVM pattern?


Solution

  • 1) Do not call Play() from the view model. Raise an event in the view model instead (for instance PlayRequested) and listen to this event in the view:

    view model:

    public event EventHandler PlayRequested;
    ...
    if (this.PlayRequested != null)
    {
        this.PlayRequested(this, EventArgs.Empty);
    }
    

    view:

    ViewModel vm = new ViewModel();
    this.DataContext = vm;
    vm.PlayRequested += (sender, e) =>
    {
        this.myMediaElement.Play();
    };
    

    2) You can expose in the view model a public boolean property, and bind the Visibility property of your controls to this property. As Visibility is of type Visibility and not bool, you'll have to use a converter.

    You can find a basic implementation of such a converter here. This related question might help you too.