2010-10-16 54 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... 
    } 
}