如何使用MVVM处理WPF ListBox的SelectionChanged事件

17

我正在尝试在WPF中使用MVVM执行listbox更改事件。请告诉我如何执行selectionchanged事件。

3个回答

36

你可以使用以下步骤完成:

  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。请告诉我解决方案。 - skumar
这是因为您在XAML中使用了Blend行为,这对VS设计师来说并不是很友好,我建议使用Expression Blend来设计您的GUI。这篇文章可能会对您有所帮助http://social.msdn.microsoft.com/Forums/en/wpf/thread/25e5082d-71ea-41b8-a6e6-dea07449aaa1 - Muhammad Ummar
我已经尝试了以下方式:xmlns:Local="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"。但是在XAML设计中,我遇到了“在InvokeCommandAction类型中未找到属性Command”的错误。 - skumar
为什么不这样做?"xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" - Muhammad Ummar
建议修改:对于Microsoft.Xaml.Behaviors,命名空间为http://schemas.microsoft.com/xaml/behaviors - Zev Spitz
显示剩余3条评论

35

你应该将列表框的SelectedItem属性绑定到ViewModel上的属性:

<ListBox SelectedItem="{Binding SelectedItem}" ...>
    ....
</ListBox>
在该属性中,始终会有从ListBox中选择的项。如果您真的需要在选择更改时执行某些操作,可以在该属性的setter方法中执行:
public YourItem SelectedItem
{
    get { return _selectedItem; }
    set
    {
        if(value == _selectedItem)
            return;

        _selectedItem = value;

        NotifyOfPropertyChange("SelectedItem");

        // selection changed - do something special
    }
}

6
别忘了将双向绑定模式指定为 mode。 - Scott Nimrod
4
应该把这作为默认设置。 - Daniel Hilgarth
属性设置器会在ViewModel加载时触发事件,对吗?因为你绑定了ItemsSource,所以SelectedItem也会被设置...通常我只期望在用户更改值时才执行操作,而不是在代码中... - dba
1
请注意,对于 SelectionMode="Multiple""Extended",这仅适用于选择的第一项 - 当您展开选择时**SelectedItem不会改变**。在这种情况下,接受的答案可以正常工作(并允许将ListBox的 SelectedItems 列表作为命令参数传递:`CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListBox}, Path=SelectedItems}")。 - spacer

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接