2010-10-16 103 views
1

昨天我開始使用MVVM-Light與WPF,它在構建代碼時真的有所作爲。但現在我想弄清楚如何處理事件。MVVM-Light事件怎麼樣?

可以說我有一個TabControl的這個觀點。在每個TabItem中我都有一個ListBox。現在我該如何處理事件SelectionChanged? 並搞砸了,我可以發送ListBox的事件作爲參數?

我非常感謝一個簡單的代碼示例。

回答

4

在選擇更改事件的情況下,最好使用WPF內置支持:創建包裝您的集合的ICollectionView,將其綁定到ItemsControl(ListBox等),並且ICollectionView將自動具有其CurrentItem與當前選擇同步。當然,這隻適用於單一選擇。

對於無法以MVVM方式乾淨處理的更復雜的事件,最好使用MVVM Light中的Messenger類來發送消息並讓它們被偵聽器捕獲;例如,視圖可以發送NotificationMessage,ViewModel可以註冊爲Messenger.Register(我認爲這是所謂的)。這是一個非常可擴展的機制 - 你也可以發送一個動作(Action<>Func<>或其他什麼)由另一方執行等等。

這些技巧讓我通過兩個中型LOB應用程序順利。

0

如果您想更嚴格地使用MVVM方法(或討厭以在代碼隱藏中進行編碼),則EventToCommand可以是另一種選擇。 它也在MVVM-light工具箱中。

在視圖(XAML)中,列表框中的SelectedItem被提供給ViewModel,如下所示。

<ListBox Name="controlType" ItemsSource={Binding Path=items}> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cmd:EventToCommand Command="{Binding Path=SelectControlType, Mode=OneWay}" CommandParameter="{Binding Path=SelectedItem, ElementName=controlType}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

在視圖模型,RelayCommand和接收方法如下面的數據。

public ICommand SelectControlType 
{ 
    get { return _selectControlType ?? (_selectControlType = new RelayCommand<object>(DoSomething)); } 
} 

// backing field. 
private RelayCommand<object> _selectControlType; 

// method to handle the data from SelectionChanged event  
public void DoSomething(object param) 
{ 
    if(param is ValidItemType) 
    { 
     // Do somthing... 
    } 
}