如何在WPF KeyBinding中从DataGrid传递单元信息?
我有一个DataGrid列出MobileInfo集合。 DataGrid配置为SelectionUnit="FullRow"
。 如果我单击任何行然后它选择整行,另外它指向单元格与鼠标被击中的边界。 键盘导航时边框选择移动例如: Left
, Right
, Up
和Down
。 基于单元格选择,我希望传递有关单元格的信息。
请参阅具有输出屏幕的图像
在上面的屏幕截图中,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 } } }