对于那些使用纯 MVVM 的人来说,如何处理 ComboBox SelectionChanged 事件而不恢复到代码隐藏?
我尝试过,例如AttachedBehaviors 但不支持 Event="SelectedChanged":
<ComboBox>
<ComboBoxItem Content="Test1">
<c:CommandBehaviorCollection.Behaviors>
<c:BehaviorBinding Event="SelectionChanged"
Command="{Binding SelectedChanged}"
CommandParameter="MainBorder123"/>
</c:CommandBehaviorCollection.Behaviors>
</ComboBoxItem>
<ComboBoxItem Content="Test2"/>
<ComboBoxItem Content="Test3"/>
</ComboBox>
这篇文章很旧了,但因为我遇到了同样的问题。这是我解决它的方法(使用框架 4.0):想法是使用 System.Windows.Interactivity。
在 XAML 中:
<ComboBox ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
然后你只需要在你的视图模型中实现 SelectionChangedCommand 。
我不确定您所追求的是否可行,但我这样做的方法是将 SelectedItem 简单地绑定到视图模型上的属性。然后在属性设置器中,我调用我想要发生的任何自定义代码,即根据规则设置其他属性。如果我还需要将所选项目绑定到对象(以便其他绑定控件更新),我也在 setter 中设置它并发出通知。
您可以使用数据触发器来触发不同 UI 元素上的事件,例如“启用/禁用,或可见/不可见”
如果您希望所选元素在其他 UI 元素中显示对象数据,那么您可以使用数据绑定并将 UI 数据显示元素的数据上下文设置为绑定到组合框中当前选定的项目。
适用于.NET CORE及以上版本
使用命名空间
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
那么comobox应该是
<ComboBox ItemsSource="{Binding Items}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
注意:代码完全没有变化,唯一需要的是Nuget包和更新命名空间