我昨天开始在WPF中使用MVVM-Light,它在构建代码方面确实有所作为。但现在我想弄清楚如何处理事件。
让我说我有这个观点,有一个TabControl。在每个TabItem中我都有一个ListBox。现在我如何处理事件SelectionChanged? 搞砸了,我可以将ListBox作为参数发送给事件吗?
我非常感谢一个简单的代码示例。
答案 0 :(得分:4)
在选择更改事件的情况下,最好使用WPF内置支持:创建包装集合的ICollectionView,将其绑定到ItemsControl(ListBox等),ICollectionView将自动同步其CurrentItem到目前的选择。当然,这仅适用于单一选择。
对于无法以MVVM方式干净利落地处理的更复杂事件,最好使用MVVM Light中的Messenger类发送消息并让它们被侦听器捕获;例如,View可以发送NotificationMessage,ViewModel可以注册为Messenger.Register
的收件人(我认为它被称为)。这是一个非常可扩展的机制 - 你也可以发送一个动作(Action<>
或Func<>
或其他),由另一方等执行。
这些技巧让我顺利通过了两个中等大小的LOB应用程序。
答案 1 :(得分: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>
在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...
}
}