MVVM架构下Multi选择ListBox右键获取点击文本的方法
解决ListBox右键获取未选中项Message文本的问题
要实现右键点击任意ListBox项的Message文本(无论是否选中)并传递给新窗口,需要修改XAML的命令参数绑定,同时调整C#命令的执行逻辑:
1. 修改XAML中的上下文菜单命令参数
在MenuItem中添加CommandParameter,绑定到上下文菜单的PlacementTarget(即右键点击的TextBlock)的DataContext,这样就能拿到当前项对应的DataMessages实例:
<TextBlock Text="{Binding Message}"> <TextBlock.ContextMenu> <ContextMenu DataContext="{Binding DataContext, Source={local:RootObject}}"> <MenuItem Header="Decode Message" Command="{Binding OpenMessageDecodeWindow}" CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> </ContextMenu> </TextBlock.ContextMenu> </TextBlock>
2. 调整C#命令定义与执行逻辑
首先确保你的命令支持接收参数(以常见的RelayCommand为例),然后修改执行方法,从参数中提取Message内容:
命令定义(ViewModel构造函数中)
// 假设已引入RelayCommand实现 public ICommand OpenMessageDecodeWindow { get; } public YourViewModel() { // 初始化带参数的命令 OpenMessageDecodeWindow = new RelayCommand<DataMessages>(ExecuteOpenMessageDecodeWindow); }
执行方法修改
private void ExecuteOpenMessageDecodeWindow(DataMessages clickedMessage) { if (clickedMessage == null) return; MessageDecodeWindow mdWin = new MessageDecodeWindow() { DataContext = new MessageDecodeWindowViewModel() { DATAMessage = clickedMessage.Message } }; mdWin.ShowDialog(); }
说明
ContextMenu的PlacementTarget指向触发菜单的TextBlock,而TextBlock的DataContext就是当前绑定的DataMessages对象,因此能直接获取到对应的Message字段。- 这种方式不受项是否选中的影响,右键点击任意项都能拿到对应的消息内容。
内容的提问来源于stack exchange,提问作者Athens66
相关产品推荐
相关产品推荐

