如何在 MVVM 中处理 ComboBox SelectionChanged?

发布于 2024-07-24 02:50:25 字数 762 浏览 14 评论 0原文

对于那些使用纯 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>

For those doing pure MVVM, how do you handle a ComboBox SelectionChanged event without reverting to code behind?

I tried e.g. AttachedBehaviors but Event="SelectedChanged" is not supported:

<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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

绻影浮沉 2024-07-31 02:50:25

这篇文章很旧,但因为我遇到了同样的问题。 这是我解决它的方法(使用框架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 即可。

This post is quite old, but since I got the same issue. Here is how I solved it (using framework 4.0) : the idea is to use System.Windows.Interactivity.

In the XAML :

<ComboBox ItemsSource="{Binding Items}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

Then you just need to implement the SelectionChangedCommand in your viewmodel.

巡山小妖精 2024-07-31 02:50:25

我不确定您所追求的是否可行,但我这样做的方法是将 SelectedItem 简单地绑定到视图模型上的属性。 然后在属性设置器中,我调用我想要发生的任何自定义代码,即根据规则设置其他属性。 如果我还需要将所选项目绑定到对象(以便其他绑定控件更新),我也会在设置器中设置它并发出通知。

I'm not sure if what you're after is possible, but the way I do it is to simply bind the SelectedItem to a property on view model. Then within the property setter, I call any custom code that I want to happen i.e. setting other properties based on rule. If I need the selected item to be bound to an object aswell (for other bound controls to update) I set this in the setter too and send out a notification.

风和你 2024-07-31 02:50:25

您可以使用数据触发器在不同的 UI 元素上触发事件,例如“启用/禁用或可见/不可见”。

如果您希望所选元素在其他 UI 元素中显示对象数据,那么您可以使用数据绑定并设置要绑定到组合框中当前所选项目的 UI 数据显示元素的 datacontext。

You would use a data trigger to trigger an event on a different UI element such as "enable / disable, or visible /invisible"

If you want the selected element to show the object data in other UI elements then you would use data binding and set the datacontext of the UI data display elements to be bound to the currently selected item in the combo box.

∞觅青森が 2024-07-31 02:50:25

对于.NET CORE及更高版本


  1. 安装 Microsoft.Xaml.Behaviors.Wpf

  2. 使用命名空间
    xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

  3. 那么 comobox 应该是

<ComboBox ItemsSource="{Binding Items}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

注意到:代码根本没有改变,唯一需要的是Nuget包和更新命名空间

For .NET CORE and above


  1. Install Microsoft.Xaml.Behaviors.Wpf package

  2. Use the namespace
    xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

  3. Then the comobox should be

<ComboBox ItemsSource="{Binding Items}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ComboBox>

notice: there are no changes to the code at all, the only needed thing is the Nuget package and updating the namespace

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文