昨天我開始使用MVVM-Light與WPF,它在構建代碼時真的有所作爲。但現在我想弄清楚如何處理事件。MVVM-Light事件怎麼樣?
可以說我有一個TabControl的這個觀點。在每個TabItem中我都有一個ListBox。現在我該如何處理事件SelectionChanged? 並搞砸了,我可以發送ListBox的事件作爲參數?
我非常感謝一個簡單的代碼示例。
昨天我開始使用MVVM-Light與WPF,它在構建代碼時真的有所作爲。但現在我想弄清楚如何處理事件。MVVM-Light事件怎麼樣?
可以說我有一個TabControl的這個觀點。在每個TabItem中我都有一個ListBox。現在我該如何處理事件SelectionChanged? 並搞砸了,我可以發送ListBox的事件作爲參數?
我非常感謝一個簡單的代碼示例。
在選擇更改事件的情況下,最好使用WPF內置支持:創建包裝您的集合的ICollectionView,將其綁定到ItemsControl(ListBox等),並且ICollectionView將自動具有其CurrentItem與當前選擇同步。當然,這隻適用於單一選擇。
對於無法以MVVM方式乾淨處理的更復雜的事件,最好使用MVVM Light中的Messenger類來發送消息並讓它們被偵聽器捕獲;例如,視圖可以發送NotificationMessage,ViewModel可以註冊爲Messenger.Register
(我認爲這是所謂的)。這是一個非常可擴展的機制 - 你也可以發送一個動作(Action<>
或Func<>
或其他什麼)由另一方執行等等。
這些技巧讓我通過兩個中型LOB應用程序順利。
如果您想更嚴格地使用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...
}
}