You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:35