我昨天开始在WPF中使用MVVM-Light,当涉及到构建代码时,这真的很重要。但现在我正在尝试弄清楚如何处理事件。
假设我有一个带有TabControl的视图。在每个TabItem中,我都有一个ListBox。现在我该如何处理事件SelectionChanged呢?更糟糕的是,我可以将事件作为参数发送ListBox吗?
我非常感谢你提供了一个简单的代码示例。
发布于 2010-10-18 06:58:29
在选择更改事件的情况下,最好使用WPF内置支持:创建包装集合的ICollectionView,将其绑定到ItemsControl (ListBox等)。并且ICollectionView将使其CurrentItem自动同步到当前选择。当然,这只适用于单项选择。
对于不能以MVVM方式干净地处理的更复杂的事件,使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们总是更好;例如,视图可以发送NotificationMessage,而ViewModel可以向Messenger.Register注册为接收者(我认为它是被调用的)。这是一种非常可扩展的机制--你还可以发送一个动作(Action<>或Func<>或其他任何东西),让对方执行,等等。
这些技巧让我顺利地通过了两个中型LOB应用程序。
发布于 2011-10-07 21:25:56
如果您希望更严格地使用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...
}
}https://stackoverflow.com/questions/3948780
复制相似问题