2012-06-16 88 views
1

在Silverlight/WPF中使用MVVM模式,您如何連接事件處理程序?我試圖綁定XAML 單擊屬性到視圖模型中的委託,但無法使其工作。MVVM在Silverlight中連接事件處理程序的方式

換句話說,我要取代這個:

<Button Content="Test Click" Click="Button_Click" /> 

其中Button_Click是:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // ... 
} 

與此:

<Button Content="Test Click" Click="{Binding ViewModel.HandleClick}" /> 

其中HandleClick是處理程序。試圖引發運行時異常:

'System.Windows.Data.Binding'類型的對象無法轉換爲類型'System.Windows.RoutedEventHandler'。

回答

4

的MVVM的方式做所以通過使用命令和ICommand interface。 該Button控制具有名爲Command接收類型的對象ICommand

A的ICommand常用的實現是Prism's DelegateCommand一個屬性。在XAML

public class ViewModel 
{ 
    public ICommand DoSomethingCommand { get; private set; } 

    public ViewModel() 
    { 
     DoSomethingCommand = new DelegateCommand(HandleDoSomethingCommand); 
    } 

    private void HandleDoSomethingCommand() 
    { 
     // Do stuff 
    } 
} 

然後:要使用它,您可以在您的視圖模型做

<Button Content="Test Click" Command={Binding DoSomethingCommand} /> 

此外,請確保視圖模型設置爲您視圖的DataContext的。這樣做的一個方法是在你的視圖的後臺代碼:

this.DataContext = new ViewModel(); 

This article是開始,如果你想知道更多關於MVVM的好地方。

0

答案是使用微軟在Prism框架中提供的擴展。隨着這些DLL System.Windows.Interactivity.dllMicrosoft.Expression.Interactions.dll,有可能在一個視圖模型的事件處理程序方法綁定:

<Button Content="Test Click" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    > 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <ei:CallMethodAction TargetObject="{Binding ViewModel}" MethodName="HandleClick" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 
+1

我想說這個方法應該可以用於除Click之外的事件,因爲Button控件已經有了Command屬性,這使得它更容易(也許更加正確)點擊'事件。 –