如何在MVVM ListBox Silverlight中实现SelectionChanged

时间:2012-01-01 11:55:46

标签: silverlight mvvm listbox command selectionchanged

ListBox控件未实现Command属性。我必须为SelectionChanged事件附加一些功能。有人知道我该怎么办?请帮帮我

5 个答案:

答案 0 :(得分:19)

我更喜欢使用绑定到SelectedItem并在绑定属性的设置中实现任何功能。

<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />

...

public class ViewModel
{
    public IEnumerable<Item> Items { get; set; } 

    private Item selectedItem;
    public Item SelectedItem
    {
        get { return selectedItem; }
        set
        {
            if (selectedItem == value)
                return;
            selectedItem = value;
            // Do logic on selection change.
        }
    }
}

答案 1 :(得分:15)

这是您可以在MVVM应用程序中达到选择已更改事件的方式 首先,我告诉你Command属性只适用于Button现在我们必须明确 在我们的选择更改事件中绑定该属性,如列表框或组合框 在您的XMAL文件中

<ListBox Name="MyListBox" ItemsSource="{Binding ListItems}" Height="150" Width="150" Margin="281,32,-31,118">

        <Local:Interaction.Triggers>
            <Local:EventTrigger EventName="SelectionChanged">
                <Local:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=MyListBox,Path=SelectedItem}"/>
            </Local:EventTrigger>
        </Local:Interaction.Triggers>
    </ListBox>

为此你必须添加dll Syatem.Windows.Interactivity  现在你必须在你的xaml文件命名空间中添加引用,如

 xmlns:Local="clr-namespace:System.Windows.Interactivityassembly=System.Windows.Interactivity"

在ViewModel类中,您必须在Con结构中定义命令

 public ViewModel123()
    {
         MyCommand = new RelayCommand<string>(TestMethod);

    }

现在创建可以处理选择更改事件的TestMethod方法

 private void TestMethod(string parameter)
    {
        MessageBox.Show(parameter);
    }

我希望这可以帮到你。

答案 2 :(得分:2)

基本上你有几个选择:

  1. 使用ListBox的SelectedItem属性绑定到后端的属性(即在视图模型中),并按照 Cameron MacFarland 所述在setter中执行逻辑。
  2. 使用具有通用事件的第三方库来命令行为,例如 Pedro Lamas 发布的链接。
  3. 如果您不想使用第三方库或在属性内部编写逻辑,则设置器在某种程度上是不可接受的,您可以为ListBox控件创建自己的行为。它会订阅控件的SelectionChanged事件并执行命令(该命令可能是行为公开的依赖属性)。

答案 3 :(得分:1)

认为Laurent Bugnion的这篇文章将帮助您解决问题:

http://geekswithblogs.net/lbugnion/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

上面的帖子提到了DataGrid,但我认为它也适用于ListBox!

祝你好运,新年快乐!! :)

答案 4 :(得分:0)

我建议使用RelayCommand。要么使用MVVM Light Toolkit,要么只使用Josh Smith's implementations中的RelayCommandCommandManager类。我个人只使用这两个类,所以我不需要整个工具包。

虽然这肯定会有效,但根据您的工作情况,可能会有更简单的方法。将对象绑定到SelectedValue的{​​{1}}并监听要更改的值可能更容易。