Wpf MVVM Light事件呢?
我昨天开始在WPF中使用mvvmlight,它在构建代码时确实起到了作用。但现在我想知道如何处理这个事件 假设我有这个视图,带有一个TabControl。在每个选项卡项中,我都有一个列表框。现在我如何处理事件SelectionChanged? 为了把事情搞砸,我可以发送带有事件作为参数的列表框吗Wpf MVVM Light事件呢?,wpf,mvvm-light,selectionchanged,Wpf,Mvvm Light,Selectionchanged,我昨天开始在WPF中使用mvvmlight,它在构建代码时确实起到了作用。但现在我想知道如何处理这个事件 假设我有这个视图,带有一个TabControl。在每个选项卡项中,我都有一个列表框。现在我如何处理事件SelectionChanged? 为了把事情搞砸,我可以发送带有事件作为参数的列表框吗 我非常感谢一个简单的代码示例 在选择更改事件的情况下,最好使用WPF内置支持:创建一个ICollectionView包装您的集合,将其绑定到ItemsControl(ListBox等)上,ICollec
我非常感谢一个简单的代码示例 在选择更改事件的情况下,最好使用WPF内置支持:创建一个ICollectionView包装您的集合,将其绑定到ItemsControl(ListBox等)上,ICollectionView将其CurrentItem自动同步到当前选择。当然,这只适用于单一选择 对于无法以MVVM方式干净处理的更复杂事件,最好使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们;例如,视图可以发送NotificationMessage,ViewModel可以注册为Messenger.register的收件人(我想它被称为)。这是一个非常可扩展的机制-您还可以发送一个操作(
action
或Func
或其他任何内容),由另一方执行,等等
这些技巧让我顺利地完成了两个中等规模的LOB应用程序。在选择更改事件的情况下,最好使用WPF内置支持:创建一个ICollectionView包装您的集合,将其绑定到ItemsControl(列表框等)ICollectionView将使其CurrentItem自动与当前选择同步。当然,这只适用于单一选择 对于无法以MVVM方式干净处理的更复杂事件,最好使用MVVM Light中的Messenger类发送消息并让侦听器捕获它们;例如,视图可以发送NotificationMessage,ViewModel可以注册为Messenger.register的收件人(我想它被称为)。这是一个非常可扩展的机制-您还可以发送一个操作(
action
或Func
或其他任何内容),由另一方执行,等等
这些技巧让我顺利地完成了两个中型LOB应用程序。如果您想更严格地使用MVVM方法(或者讨厌在代码隐藏中编码),EventToCommand可以是另一种选择。 它也在MVVM light工具包中 在视图(XAML)中,listbox中的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>
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...
}
}
在ViewModel中,RelayCommand和一个方法接收数据,如下所示
<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>
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...
}
}
public图标命令并选择controltype
{
获取{return\u selectControlType??(\u selectControlType=new RelayCommand(DoSomething));}
}
//后场。
专用中继命令\u选择控制类型;
//方法来处理SelectionChanged事件中的数据
公共void DoSomething(对象参数)
{
if(参数为ValidItemType)
{
//做点什么。。。
}
}
如果您想更严格地使用MVVM方法(或者讨厌在代码隐藏中编码),EventToCommand可以是另一个选项。
它也在MVVM light工具包中
在视图(XAML)中,listbox中的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>
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...
}
}
在ViewModel中,RelayCommand和一个方法接收数据,如下所示
<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>
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...
}
}
public图标命令并选择controltype
{
获取{return\u selectControlType??(\u selectControlType=new RelayCommand(DoSomething));}
}
//后场。
专用中继命令\u选择控制类型;
//方法来处理SelectionChanged事件中的数据
公共void DoSomething(对象参数)
{
if(参数为ValidItemType)
{
//做点什么。。。
}
}