【问题标题】:how to handle WPF listbox selectionchanged event using MVVM如何使用 MVVM 处理 WPF 列表框 selectionchanged 事件
【发布时间】:2012-09-06 09:58:37
【问题描述】:

我正在尝试使用 MVVM 在 WPF 中执行列表框更改事件。请让我知道如何执行此 selectionchanged 事件。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    你可以使用

    1. 在您的项目中添加对System.Windows.Interactivity 的引用
    2. 在 XAML 中添加 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

    然后

    <ListBox>
      <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
          <i:InvokeCommandAction Command="{Binding YourCommand}"
                                 CommandParameter="{Binding YourCommandParameter}" />
        </i:EventTrigger>
      </i:Interaction.Triggers>
    </ListBox>
    

    【讨论】:

    • 您好 Ummar,感谢您的回答,但我收到此错误 Interactions 中未找到可附加属性 Triggers。请告诉我解决方案。
    • 你在 XAML 设计器中得到这个吗?并且您的项目必须可以正常编译和执行。您使用的是什么版本的 Visual Studio?
    • 是的,我正在使用 XAML。我在 Windows 7 64 位操作系统上使用 VS 2010
    • 这是因为你在 XAML 中使用了 Blend 行为,这对 VS 设计者不是很友好,我更喜欢使用 Expression Blend 来设计你的 GUI。这篇文章可能会对你有所帮助social.msdn.microsoft.com/Forums/en/wpf/thread/…
    • 我尝试了以下方法:xmlns:Local="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"。为此,我得到了 XAML 设计中的 InvokeCommandAction 类型错误中未找到属性命令
    【解决方案2】:

    您可以将列表框的 SelectedItem 属性绑定到 ViewModel 上的属性:

    <ListBox SelectedItem="{Binding SelectedItem}" ...>
        ....
    </ListBox>
    

    在该属性中,总是会有 ListBox 中的选定项。如果您确实需要在选择更改时执行某些操作,您可以在该属性的设置器中执行此操作:

    public YourItem SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            if(value == _selectedItem)
                return;
    
            _selectedItem = value;
    
            NotifyOfPropertyChange("SelectedItem");
    
            // selection changed - do something special
        }
    }
    

    【讨论】:

    • 别忘了将 TwoWay 绑定指定为模式。
    • @ScottNimrod:这应该是默认设置。
    • 即使加载了 Viewmodel,prop setter 也会触发事件,不是吗?当你绑定 itemssoruce 时,selecteditem 也将被设置......通常我只希望用户更改值而不是代码时才会执行操作.....
    • 请注意,对于 SelectionMode="Multiple""Extended",这仅适用于选择的第一个项目 - 当您展开选择时 SelectedItem 不会改变。在这种情况下,接受的答案可以正常工作(并允许将 ListBox 的 SelectedItems 列表作为命令参数传递:CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=SelectedItems}")。
    【解决方案3】:

    您可以将 ListBox SelectionChanged 事件绑定到 ViewModel 中的命令。

    看到这个答案 https://stackoverflow.com/a/18960028/5627499

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多