【发布时间】:2012-01-31 08:29:10
【问题描述】:
ListBox 控件没有实现 Command 属性。我必须将一些功能附加到 SelectionChanged 事件。有人知道我该怎么做吗?请帮帮我
【问题讨论】:
标签: silverlight mvvm listbox command selectionchanged
ListBox 控件没有实现 Command 属性。我必须将一些功能附加到 SelectionChanged 事件。有人知道我该怎么做吗?请帮帮我
【问题讨论】:
标签: silverlight mvvm listbox command selectionchanged
认为 Laurent Bugnion 的这篇文章将帮助您解决问题:
上面的帖子提到了 DataGrid,但我确实认为它也可以与 ListBox 一起使用!
最好的问候和新年快乐! :)
【讨论】:
我建议使用RelayCommand。要么使用MVVM Light Toolkit,要么只使用Josh Smith's implementations 中的RelayCommand 和CommandManager 类。我个人只使用这两个类,所以我不需要整个工具包。
虽然这肯定会奏效,但可能会有更简单的方法,具体取决于您正在做什么。将对象绑定到ListBox 的SelectedValue 并监听该值的变化可能会更容易。
【讨论】:
我更喜欢使用到 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.
}
}
}
【讨论】:
基本上你有几个选择:
SelectionChanged 事件并执行命令(该命令可能是行为暴露的依赖属性)。【讨论】:
这是您可以在 MVVM 应用程序中访问选择更改事件的方式 首先我告诉你命令属性只在按钮中有效,现在我们必须明确 在我们的 Selection Changed 事件中绑定该属性,例如列表框或组合框 在你的 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);
}
我希望这可以帮助你。
【讨论】: