ListBox 控件不实现 Command 属性。我必须将一些功能附加到 SelectionChanged 事件。有人知道我该怎么做吗?请帮我
5 回答
我更喜欢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.
}
}
}
这是您可以在您的 MVVM 应用程序中访问选择更改事件的方式首先我告诉您命令属性仅在按钮中工作现在我们必须在我们的选择更改事件中显式绑定该属性,例如您的列表框或组合框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);
}
我希望这可以帮助你。
基本上你有几个选择:
- 使用 ListBox 的 SelectedItem 属性绑定到后端中的属性(即在视图模型中)并按照Cameron MacFarland的描述在 setter 中执行逻辑。
- 使用具有通用事件的第三方库来命令行为,例如Pedro Lamas发布的链接中的行为。
- 如果您不想使用第三方库或在属性设置器中编写逻辑在某种程度上是不可接受的,您可以为 ListBox 控件创建自己的行为。它将订阅控件的
SelectionChanged
事件并执行命令(该命令可能是行为暴露的依赖属性)。
认为 Laurent Bugnion 的这篇文章将帮助您解决问题:
上面的帖子提到了 DataGrid,但我确实认为它也可以与 ListBox 一起使用!
最好的问候和新年快乐!:)
我建议使用RelayCommand
. 要么使用MVVM Light Toolkit,要么只使用Josh Smith 的 implementationsRelayCommand
中的andCommandManager
类。我个人只使用这两个类,所以我不需要整个工具包。
虽然这肯定会奏效,但可能会有更简单的方法,具体取决于您在做什么。将对象绑定到SelectedValue
ofListBox
并监听该值的更改可能会更容易。