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

在WPF的MVVM Light中如何为EventToCommand传递参数

WPF DataGrid双击传递选中行DocumentCode参数解决方案

1. 修复EventToCommand的参数绑定问题

你当前XAML中EventToCommand的参数绑定逻辑错误,SelectedValuePath是指定SelectedValue对应的属性名,并非直接获取属性值。直接绑定选中项的DocumentCode属性即可解决问题:

<DataGrid Grid.Column="1"
          Grid.Row="1"
          x:Name="dgwOperationMain"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          Margin="0,0,0,0"
          Width="700"
          Height="425"
          IsReadOnly="True"
          Loaded="dgwOperationMain_Loaded"
          AutoGenerateColumns="False"
          FontFamily="/Fonts/#Poppins"
          ScrollViewer.CanContentScroll="False" 
          MouseDoubleClick="dgwOperationMain_MouseDoubleClick">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick"
                        SourceObject="{Binding ElementName=dgwOperationMain}">
            <cmd:EventToCommand Command="{Binding CustomerOperationViewCommand}"
                                CommandParameter="{Binding ElementName=dgwOperationMain, Path=SelectedItem.DocumentCode}"
                                PassEventArgsToCommand="False" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <!-- 列定义保持不变 -->
    <DataGrid.Columns>
        <DataGridTextColumn Header="DocumentCode"
                            MinWidth="120"
                            Binding="{Binding DocumentCode}" />
        <DataGridTextColumn Header="Operator"
                            MinWidth="50"
                            Binding="{Binding Operator}" />
        <DataGridTextColumn Header="StartDate"
                            MinWidth="70"
                            Binding="{Binding StartDate}" />
        <DataGridTextColumn Header="EndDate"
                            MinWidth="70"
                            Binding="{Binding EndDate}" />
        <DataGridTextColumn Header="Pax"
                            MinWidth="20"
                            Binding="{Binding Pax}" />
        <DataGridTextColumn Header="Room"
                            MinWidth="20"
                            Binding="{Binding Room}" />
        <DataGridTextColumn Header="Currency"
                            MinWidth="30"
                            Binding="{Binding Currency}" />
    </DataGrid.Columns>
</DataGrid>

2. ViewModel中命令的参数接收处理

假设你使用RelayCommand实现命令,ViewModel中需要定义接收string类型参数的命令,用于打开新视图并传递参数:

public ICommand CustomerOperationViewCommand { get; }

// 构造函数中初始化命令
public YourViewModel()
{
    CustomerOperationViewCommand = new RelayCommand<string>(OpenCustomerOperationView);
}

private void OpenCustomerOperationView(string documentCode)
{
    if (string.IsNullOrWhiteSpace(documentCode))
    {
        MessageBox.Show("请选择有效行!");
        return;
    }

    // 初始化新视图并传递参数
    var customerView = new CustomerOperationView();
    var customerViewModel = new CustomerOperationViewModel(documentCode);
    customerView.DataContext = customerViewModel;
    customerView.Show();

    // 如果需要直接绑定数据,可替换为你的业务逻辑
    // dgwCustomerOperation.ItemsSource = _customerOperationService.GetCustomerOperation(documentCode);
    // ShowCustomer();
}

3. 替代方案:简化后台事件处理(非MVVM场景)

如果暂时不使用MVVM命令,可直接优化后台MouseDoubleClick事件代码,避免字符串截取这种易出错的写法:

private void dgwOperationMain_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    try
    {
        // 替换为你实际的数据项类型(比如OperationModel)
        var selectedItem = dgwOperationMain.SelectedItem as OperationModel;
        if (selectedItem == null)
        {
            MessageBox.Show("请选择有效行!");
            return;
        }

        string documentCode = selectedItem.DocumentCode;
        _documentCode = documentCode;
        dgwCustomerOperation.ItemsSource = _customerOperationService.GetCustomerOperation(documentCode);
        ShowCustomer();
    }
    catch (Exception)
    {
        MessageBox.Show("Not Valid!");
    }
}

注意事项

  • 确保你的数据项类(如OperationModel)有public可访问的DocumentCode属性,否则绑定或属性访问会失败。
  • 建议优先使用MVVM模式传递参数,避免后台代码直接操作UI,提升代码可维护性。
  • 操作前判断SelectedItem是否为null,避免空引用异常。

内容的提问来源于stack exchange,提问作者Eymen Efe Altun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:00:03