2011-12-06 5 views
8

Я все еще изучаю веревки MVVM и WPF, и на данный момент я пытаюсь создать медиаплеер с использованием MVVM. После интенсивного поиска в Google я решил, что использование CommanParameter будет лучшим способом избежать кода. Я считаю, что код и XAML выглядят прекрасно, но нет волшебства - AKA ничего не происходит.Как использовать CommandParameter с RelayCommand?

Есть ли какая-то душа, кто бы мог подумать о моем коде и дать мне совет? Как всегда, я действительно ценю ваши ответы. Пожалуйста, игнорируйте мои множественном в RelayCommands, было уже поздно :)

Xaml

<MediaElement Name="MediaElement" 
    Source="{Binding VideoToPlay}" 
    Width="400" Height="180" Stretch="Fill" 
    LoadedBehavior="Manual" UnloadedBehavior="Manual"/> 
<Slider Name="timelineSlider" Margin="5" Width="250" 
    HorizontalAlignment="Center"/> 
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 
<Button 
    Command="{Binding PlayMediaCommand}" 
    CommandParameter="{Binding ElementName=MediaElement, Mode=OneWay}">&lt;&lt;</Button> 

C#

class MediaPlayerViewModel: INotifyPropertyChanged 
{ 
    private MediaElement MyMediaElement; 

    private Uri _videoToPlay; 

    public Uri VideoToPlay 
    { 
     get { return _videoToPlay; } 
     set 
     { 
      _videoToPlay = value; 
      OnPropertyChanged("VideoToPlay"); 
     } 
    } 

    void SetMedia() 
    { 
     OpenFileDialog dlg = new OpenFileDialog(); 
     dlg.InitialDirectory = "c:\\"; 
     dlg.Filter = "Media files (*.wmv)|*.wmv|All Files (*.*)|*.*"; 
     dlg.RestoreDirectory = true; 

     if (dlg.ShowDialog() == true) 
     { 
      VideoToPlay = new Uri(dlg.FileName); 

     } 
    } 

    RelayCommands _openFileDialogCommand; 
    public ICommand OpenFileDialogCommand 
    { 
     get 
     { 
      if (_openFileDialogCommand == null) 
      { 
       _openFileDialogCommand = new RelayCommands(p => SetMedia(), 
        p => true); 
      } 
      return _openFileDialogCommand; 
     } 
    } 

    RelayCommands _playMediaCommand; 
    public ICommand PlayMediaCommand 
    { 
     get 
     { 
      if (_playMediaCommand == null) 
      { 
       _playMediaCommand = new RelayCommands(p => PlayMedia(p), 
        p => true); 
      } 
      return _playMediaCommand; 
     } 
    } 

    void PlayMedia(object param) 
    { 
     var paramMediaElement = (MediaElement)param; 
     MyMediaElement = paramMediaElement; 
     MyMediaElement.Source = VideoToPlay; 
     MyMediaElement.Play(); 
    } 



    protected void OnPropertyChanged(string propertyname) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyname)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 




class RelayCommands: ICommand 
{ 
    private readonly Predicate<object> _canExecute; 
    private readonly Action<object> _execute; 

    public event EventHandler CanExecuteChanged; 

    public RelayCommands(Action<object> execute) 
     : this(execute, null) 
    {} 

    public RelayCommands(Action<object> execute, 
        Predicate<object> canExecute) 
    { 
     _execute = execute; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 

     if (_canExecute == null) 
     { 
      return true; 
     } 

     return _canExecute(parameter); 
    } 

    public void Execute(object parameter) 
    { 
     _execute(parameter); 
    } 

    public void RaiseCanExecuteChanged() 
    { 
     if (CanExecuteChanged != null) 
     { 
      CanExecuteChanged(this, EventArgs.Empty); 
     } 
    } 

} 
+0

Предполагаете, что вы настроили контекст данных на вид? – kenny

+1

да я сделал :) он установлен в окно –

ответ

1

Ваш пример кода работает отлично, как только свойство VideoToPlay было установлено. Вы уверены, что задаете это? Ваш фрагмент XAML не включает использование OpenFileDialogCommand, который устанавливает это свойство:

<Button Content="Select File" Command="{Binding OpenFileDialogCommand}" /> 
+0

Я использовал эту команду в верхнем меню, которое я забыл показать в коде здесь :), но он есть. Я все еще не могу воспроизвести кнопку воспроизведения, чтобы воспроизвести видео. –

+3

О, боже мой, я только понял, что я сделал не так. Команда находится НА НЕПРАВИЛЬНОЙ КНОПКЕ. он находится на кнопке <<. Кто-нибудь, пожалуйста, присылайте мне виртуальную пощечину. –

+0

SLAP :) SLAP :) – SvenG

Смежные вопросы