如何使用MVVM媒体元素移动到下一首歌曲

时间:2011-09-28 18:46:41

标签: c# wpf mvvm mediaelement

我正在通过构建一个简单的媒体播放器来学习C#/ WPF / MVVM。我在MainViewModel中使用ICollectionView作为播放列表。我为mediaelement构建了一个单独的usercontrol,其中有一些代码隐藏来处理音量,位置,时间线(http://www.codeproject.com/KB/smart/RSSVideoReader.aspx)。我知道MVVM的目标之一是消除代码隐藏,但WPF媒体元素是独一无二的。我现在不知道如何让代码隐藏的mediaelement的MediaEnded事件告诉MainViewModel的ICollectionView到MoveCurrentToNext。

此代码失败:

MainViewModel

public void GoNext()
    {
        this.collectionView.MoveCurrentToNext();
    }

MyMediaElement.xaml.cs(代码隐藏)

private void mPlayDefault_MediaEnded(object sender, RoutedEventArgs e)
    {

        mPlayDefault.Stop();
        this.GoNext();            

    }

如何让MainViewModel对MyMediaElement的事件作出反应? 谢谢

2 个答案:

答案 0 :(得分:2)

这是我能想到的最好的:

在ViewModel中:

public ICommand PlayCommand
{
  get
  {
    if (_playCommand == null) 
      _playCommand = new RelayCommand(player => this.play(player), param => this.canPlay); 
    return _playCommand;
  }
}
void play(object player)
{
  if (_player == null)
  {
    _player = (MediaElement)player;
    _player.MediaEnded += new RoutedEventHandler((s, e) =>
    {
      if (canPlayNext)
        playNext();
    });
  }

  _player.Play();  
}

......但我仍然愿意接受其他想法。

答案 1 :(得分:0)

Daniel Pratt是正确的(见评论)。使用Interaction.Triggers按照我的希望工作。我遇到了表达式dll的问题,并且非常沮丧。直接从codeplex下载dll并解锁它解决了这个问题。非常感谢Daniel和Stackoverflow。