2009-12-18 67 views
9

想知道人們對如何以最輕量的方式儘可能好地處理ViewModel中的事件的想法提供了想法。MVVM中的簡單事件處理

例子:

<MediaElement 
    MediaOpened={Binding SomeEventHandler} /> 

在這種情況下,我們要處理的視圖模型的MediaOpened事件。沒有像Prism這樣的框架,如何將其綁定到ViewModel?

回答

12

Commanding - 你的「SomeEventHandler」必須實現ICommand一類...有可用的網絡文學一堆...

而且 - 我會考慮讓一個免費的,輕量級的「迷你」 MVVM框架如MvvmFoundation,它提供了RelayCommand爲這樣一個目的(而無需學習PRISM的複雜性/開銷)

編輯:

看一看this b記錄附加命令到任何事件...正如我所提到的那樣,它是非常強大的,但我想你需要做出判斷呼叫,如果這是你想要的,相比於附加一個老式事件,並使用在後面,你的代碼超薄的機身事件處理程序只是調用了一些方法,在你的視圖模型,是這樣的:

public void SomeEventHandler(object sender, SomeEventArgs e) 
{ 
    MyViewModel vm = (MyViewModel)this.DataContext; 
    vm.HandleLoadEvent(); 
} 

務實VS最佳實踐......我跟你走的。)

+0

我沒想到我能在這種情況下的使用一個ICommand ...感謝您的信息...這是一個有點重複問題,然後。 – 2009-12-18 04:00:57

+0

好吧...我只是嘗試使用ICommand,我使用MVVMFoundation,所以它是一個RelayCommand類型。但是,我得到一個構建錯誤「綁定路徑= MediaOpenedCommand,模式=一次性」'不是一個有效的事件處理程序方法名稱...「我只是把它設置錯了? – 2009-12-18 04:06:42

+0

對不起,是的...您需要將RelayCommand實例綁定到Command,並通過CommandBindings或InputBindings將其綁定到UI ...我強烈建議你稍微閱讀一下 - 從事件到命令的切換是人們對WPF持續關注的那些「陡峭的學習曲線」之一 - 但是當你饒有興趣的時候它就非常強大! – kiwipom 2009-12-18 04:12:22

0

MediaOpened是一個事件,不支持命令綁定。

爲了綁定到事件,可以使用輔助對象,該對象附着到事件並執行命令。

要綁定到視圖模型,請添加一個實現ICommand的屬性。本MSDN雜誌文章中的圖3顯示了RelayCommand,它是ICommand的有用實現。 RelayCommand使用委託進行初始化,以連接到您的視圖模型。

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

+0

我得到命令綁定問題,我已閱讀Josh Smith關於MVVM的文章,但是我遇到問題的部分是 「要綁定到事件,可能會使用一個輔助對象附加到事件並執行命令「。 通過助手對象你是否像一個附加行爲? – 2009-12-18 05:20:34

+0

是的,行爲是進行綁定的好方法。 IanR提供的鏈接看起來不錯。 – 2009-12-18 13:01:31

0

小和開源ImpromptuInterface.MVVM框架公頃event binding syntax並在.NET 4.0中使用DLR。雖然這個例子需要繼承ImpromptuViewModel。 event binding property對該特定視圖模型類型沒有任何依賴性,並且所涉及的是公開的。

<Window x:Class="MyProject.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:MVVM="clr-namespace:ImpromptuInterface.MVVM;assembly=ImpromptuInterface.MVVM" Title="MainWindow" Height="600" Width="800"> 

    <MediaElement MVVM:Event.Bind="{Binding Events.MediaOpened.To[MediaElement_MediaOpened]}" /> 

...

public class MyViewModel{ 

    public dynamic Events 
    { 
     get { return new EventBinder(this); } 
    } 

    public void MediaElement_MediaOpened(MediaElement sender, RoutedEventArgs e){ 
     ... 
    } 
} 
相關問題