在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
相关产品推荐
相关产品推荐

