Выполнить UserControl только для чтения ICommand из ViewModel - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть специализированный UserControl для воспроизведения медиа-контента, который называется PlayerView.Элемент управления имеет свои собственные команды ( только для чтения , не предоставляется клиентом).

public partial class PlayerView
{
    public PlayerView()
    {
        InitializeComponent();
        PlayCommand = new RelayCommand(() =>
            {
                // Play some media: audio/video.
            });
    }

    ...

    #region PlayCommand property

    private static readonly DependencyPropertyKey PlayCommandPropertyKey = DependencyProperty.RegisterReadOnly(
      "PlayCommand",
      typeof(ICommand),
      typeof(PlayerView),
      new PropertyMetadata());

    public static readonly DependencyProperty PlayCommandProperty = PlayCommandPropertyKey.DependencyProperty;

    public ICommand PlayCommand
    {
        get { return (ICommand)GetValue(PlayCommandProperty); }
        private set { SetValue(PlayCommandPropertyKey, value); }
    }

    #endregion

    ...
}

Команда воспроизведения элемента управления работает из XAML:

<Controls:PlayerView x:Name="PlayerView" />
<Button Command="{Binding ElementName=PlayerView, Path=PlayCommand, Mode=OneWay}" Content="Play" />

Но в настоящее время я реализую функцию слайд-шоу и хочу выполнить команду воспроизведения элемента управления из ViewModel .

public class SlideshowViewModel : ViewModelBase
{
    // Stores collection of audio/video clips to be played by the PlayerView.

    // Assume that this ViewModel should invoke PlayerView PlayCommand.
}

public class MainViewModel : ViewModelBase
{
    // Stores a lot of stuff.

    public SlideshowViewModel Slideshow { get; }
}

Class diagram

Вопрос в том, как SlideshowViewModel может выполнить PlayCommand этого элемента управления ?Есть ли лучшая практика?

1 Ответ

1 голос
/ 29 февраля 2012

Если я правильно понимаю вашу проблему, ViewModel должен содержать реализацию Команды, а не View. Это было бы более правильной реализацией MVVM, и тогда ВМ может при необходимости вызвать эту команду изнутри себя.

редактирование:

чтобы ответить на ваш вопрос,

public partial class PlayerView : IHaveAPlayCommand
{
public PlayerView()
{
      this.DataContext = new ViewModel(this);
}
}


public class ViewModel
{
      IHaveAPlayCommand view;
      public ViewModel(IHaveAPlayCommand view)
      {
           this.view = view
      }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...