2011-09-28 88 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(); 
} 

...但我仍然開放給其他想法。

相關問題