Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用MVVM mediaelement移动到下一首歌曲_C#_Wpf_Mvvm_Mediaelement - Fatal编程技术网

C# 如何使用MVVM mediaelement移动到下一首歌曲

C# 如何使用MVVM mediaelement移动到下一首歌曲,c#,wpf,mvvm,mediaelement,C#,Wpf,Mvvm,Mediaelement,我正在通过构建一个简单的媒体播放器来学习C#/WPF/MVVM。我在播放列表的主视图模型中使用ICollectionView。我为mediaelement构建了一个单独的usercontrol,其中包含一些代码来处理音量、位置和时间线()。我知道MVVM的目标之一是消除代码落后,但WPF mediaelement是唯一的。我现在一直在想如何让mediaelement的MediaEnded事件背后的代码告诉MainViewModel的ICollectionView到MoveCurrentToNex

我正在通过构建一个简单的媒体播放器来学习C#/WPF/MVVM。我在播放列表的主视图模型中使用ICollectionView。我为mediaelement构建了一个单独的usercontrol,其中包含一些代码来处理音量、位置和时间线()。我知道MVVM的目标之一是消除代码落后,但WPF mediaelement是唯一的。我现在一直在想如何让mediaelement的MediaEnded事件背后的代码告诉MainViewModel的ICollectionView到MoveCurrentToNext

此代码失败:

主视图模型

public void GoNext()
    {
        this.collectionView.MoveCurrentToNext();
    }
MyMediaElement.xaml.cs(代码隐藏)

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

丹尼尔·普拉特是正确的(见评论)。使用交互。触发器就像我希望的那样工作。我遇到了一个关于dll表达式的问题,感到非常沮丧。直接从codeplex下载dll并取消阻止它解决了问题。非常感谢Daniel和Stackoverflow

这是我能想到的最好办法:

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

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

这是一个关于使用这种特殊媒体元素的问题。您可能需要发布一些代码,但我猜只有使用过此媒体播放器的人才能帮助您。也许在CodeProject页面上发布一个问题?我不同意在使用MVVM时消除代码落后应该是一个目标。我认为目标应该是分离表示(视图)和行为/机制(视图模型)的独立关注点。因此,我不会对视图中通知viewmodel状态更改的代码产生任何问题?关于最初的问题,你可能会发现这篇博文很有帮助:添加文章中提到的dll会产生错误。未知生成错误,“无法解析对程序集的依赖关系”System.Windows,版本=2.0.5.0,区域性=中性,PublicKeyToken=7cec85d7bea7798e,因为它尚未预加载。使用ReflectionOnly API时,必须通过ReflectionOnlyAssemblyResolve事件预加载或按需加载依赖程序集。“我现在还没有找到修复程序。”。
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();  
}