【问题标题】:How do you handle a ComboBox SelectionChanged in MVVM?你如何处理 MVVM 中的 ComboBox SelectionChanged?
【发布时间】:2010-10-31 07:59:23
【问题描述】:

对于那些做纯 MVVM 的人,如何处理 ComboBox SelectionChanged 事件而不返回到后面的代码?

我试过了,例如AttachedBehaviors but 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>

【问题讨论】:

    标签: wpf events mvvm attachedbehaviors


    【解决方案1】:

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

    【讨论】:

    • 如果你不需要Command,也有CallMethodAction,尽管它确实需要将引用添加到Microsoft.Expression.Interactions.dll
    • 你如何在不给它命名的情况下在这里绑定ComboBoxSelectedItemSelectedValue
    • @Maslow 或任何其他希望将所选项目作为参数传递的人:使用绑定,请参阅here。在我的例子中,我命名了ComboBox,例如“MyCombo”,然后绑定是一个简单的{Binding ElementName=MyCombo, Path=SelectedItem}
    • 添加对System.Windows.Interactivity 的引用后,您需要将此命名空间添加到XAML 标头:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    • 对于 .net 核心,您将需要这个 nuget:https://github.com/Microsoft/XamlBehaviorsWpf。将以下内容添加到您的窗口布局 xml 到 &lt;Window/&gt; -> xmlns:i="http://schemas.microsoft.com/xaml/behaviors" 更多信息:here
    【解决方案2】:

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

    【讨论】:

    • 我认为这种方式最有意义,并且到目前为止对我来说效果很好。感谢您发布此内容。
    • 我发现这是一种非常痛苦的方法。对于简单的应用程序,这样做而不是命令很容易。但它很快就会变得笨拙。属性应该保存数据,而不是执行操作。它破坏了异步,并且使调试变得更加困难,因为 Visual Studio 默认会跳过属性设置器/获取器。
    【解决方案3】:

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

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

    【讨论】:

    • 好的,如果我只想更改 XAML,我可以这样做,但如果我想要例如使用组合框来执行 XAML 无法执行的代码,例如加载一个新的资源文件并将其附加到当前窗口?或例如更改数据库中的一些数据等
    • 然后您可以使用将您的视图模型绑定到组合框 SelectionChanged。我不确定您会在哪里寻找示例,但 Karl Shifflet 和 Josh Smith 是我为 MVVM 访问的两个主要博客,它们的博客链接如下。 karlshifflett.wordpress.com/2009/06/03/… joshsmithonwpf.wordpress.com/2009/05/20/… 抱歉,我对具体细节无能为力,我自己对 WPF 和 MVVM 还很陌生。
    • oops 忘了提到 Karl Shifflet 已经做了很多 WPF Line OF Business 活动,请在他的博客上查看它们,它们还包含一些出色的 powerpoint 示例和代码示例。
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多