2011-09-28 62 views
1

我正在通过构建简单的媒体播放器来学习C#/ WPF/MVVM。我在播放列表的MainViewModel中使用ICollectionView。我为mediaelement构建了一个单独的用户控件,并使用一些代码隐藏来处理音量,位置和时间线(http://www.codeproject.com/KB/smart/RSSVideoReader.aspx)。我知道MVVM的目标之一是消除代码隐藏,但WPF mediaelement是独一无二的。我现在试图弄清楚如何让代码隐藏mediaelement的MediaEnded事件告诉MainViewModel的ICollectionView到MoveCurrentToNext。如何使用MVVM mediaelement移动到下一首歌曲

此代码失败:

MainViewModel

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

MyMediaElement.xaml.cs(代码后面)

private void mPlayDefault_MediaEnded(object sender, RoutedEventArgs e) 
    { 

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

    } 

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

+0

这是一个关于使用此特定媒体元素的更多问题。你可能不得不张贴一些代码,但我猜只有使用过这个媒体播放器的人才能够帮助你。也许发布一个问题到CodeProject页面? –

+2

我不同意在使用MVVM时消除代码隐藏应该是一个目标。我认为目标应该是分离呈现(视图)和行为/机制(视图模型)的独立关注。因此,我不会在视图中用一些代码来通知视图模型状态改变的问题。 –

+0

我同意丹尼尔,但我该怎么做?代码是什么样的? –

回答

0

丹尼尔普拉特是正确的(见评论)。使用Interaction.Triggers按我的希望工作。我遇到了表达式DLL的问题,并完全沮丧。直接从codeplex下载DLL并解除封锁解决了问题。非常感谢Daniel和Stackoverflow。

2

这是我能想出的最好:

视图模型的内部:

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

...但我仍然开放给其他想法。

相关问题