如何在WPF KeyBinding中从DataGrid传递单元信息?

我有一个DataGrid列出MobileInfo集合。 DataGrid配置为SelectionUnit="FullRow" 。 如果我单击任何行然后它选择整行,另外它指向单元格与鼠标被击中的边界。 键盘导航时边框选择移动例如: LeftRightUpDown 。 基于单元格选择,我希望传递有关单元格的信息。

请参阅具有输出屏幕的图像

OS列中选择的单元格

在上面的屏幕截图中,Android被选中,基于键盘导航,单元格选择被更改。

我的XAML源代码:

            

注意:请勿更改DataGrid中的SelectionUnit

请提供您的解决方案,如何基于键盘导航传递单元信息

与XAML DataGrid关联的C#源代码

 public class GridViewModel { public ObservableCollection MobileList { get; set; } public GridViewModel() { MobileList = new ObservableCollection(); MobileList.Add(new MobileInfo { MobileName = "iPhone", MobileOS = "iOS" }); MobileList.Add(new MobileInfo { MobileName = "Xperia", MobileOS = "Android" }); MobileList.Add(new MobileInfo { MobileName = "Lumina", MobileOS = "Windows" }); } } public class MobileInfo { public string MobileName { get; set; } public string MobileOS { get; set; } } 

您可以将命令参数绑定到DataGrid.CurrentCell属性。 有几种方法可以实现这一点,其中一种方法是指定绑定的相对来源:

  

请注意,我删除了DataContext. 部分来自命令绑定路径(如果未明确指定source,则DataContext是绑定的默认源)。

命令参数现在将是DataGridCellInfo类型的对象,它是一个结构 ,而不是一个类。

您可以修改命令参数绑定路径以提取更具体的信息。

您可以在DataGrid xaml中使用CurrentCellChanged Event。

  CurrentCellChanged="DataGrid_CurrentCellChanged" 

码…

 private void DataGrid_CurrentCellChanged(object sender, EventArgs e) { var grid = sender as DataGrid; var cell = grid.CurrentCell.Item; } 

此代码可以帮助您实现MVVM要实现的目标:

      

ViewModel代码,

 public ICommand CurrentCellChangeCommand { get { return new RelayCommand(CurrentCellChangeExecute); } } private void CurrentCellChangeExecute(object obj) { var dataGridCellInfo = (System.Windows.Controls.DataGridCellInfo)obj; var mobileInfo = dataGridCellInfo.Item as MobileInfo; if (mobileInfo != null) { if (dataGridCellInfo.Column.Header.ToString() == "Name") { SelectedCellValue = mobileInfo.MobileName; //mobileInfo.MobileName } else if (dataGridCellInfo.Column.Header.ToString() == "OS") { SelectedCellValue = mobileInfo.MobileOS; //mobileInfo.MobileOS } } }