我昨天开始将 MVVM-Light 与 WPF 一起使用,它在构建代码时确实有所作为。但现在我正试图弄清楚如何处理事件。
可以说我有这个视图,带有一个 TabControl。在每个 TabItem 中,我都有一个 ListBox。现在我该如何处理 SelectionChanged 事件?为了把事情搞砸,我可以发送带有事件作为参数的 ListBox 吗?
我非常感谢一个简单的代码示例。
我昨天开始将 MVVM-Light 与 WPF 一起使用,它在构建代码时确实有所作为。但现在我正试图弄清楚如何处理事件。
可以说我有这个视图,带有一个 TabControl。在每个 TabItem 中,我都有一个 ListBox。现在我该如何处理 SelectionChanged 事件?为了把事情搞砸,我可以发送带有事件作为参数的 ListBox 吗?
我非常感谢一个简单的代码示例。
在选择更改事件的情况下,最好使用 WPF 内置支持:创建一个包装您的集合的 ICollectionView,将其绑定到 ItemsControl(ListBox 等),并且 ICollectionView 将使其 CurrentItem 自动同步到当前选择。当然,这只适用于单选。
对于无法以 MVVM 方式干净处理的更复杂的事件,最好使用 MVVM Light 中的 Messenger 类来发送消息并让它们被侦听器捕获;例如,View 可以发送 NotificationMessage 并且 ViewModel 可以注册为接收者Messenger.Register
(我认为它被称为)。这是一个非常可扩展的机制 - 您还可以发送一个动作(Action<>
或Func<>
其他)以由另一方执行等等等等。
这些技巧让我顺利通过了两个中型 LOB 应用程序。
如果您想更严格地使用 MVVM 方法(或者讨厌在代码隐藏中编码),EventToCommand 可以是另一种选择。它也在 MVVM-light 工具包中。
在 View(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>
在 ViewModel 中,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...
}
}