昨天我开始使用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...
}
}