我正在使用DataGrid列出MobileInfo集合。 DataGrid配置为SelectionUnit="FullRow"
。如果我单击任何行然后它选择整行,另外它指向单元格与鼠标被击中的边框。键盘导航时边框选择移动例如:Left
,Right
,Up
和Down
。根据细胞选择,我希望传递有关细胞的信息。
请参阅具有输出屏幕的图像
在上面的屏幕截图中选择Android,基于键盘导航,单元格选择会发生变化。
我的XAML源代码:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MobileList, UpdateSourceTrigger=PropertyChanged}" SelectionUnit="FullRow" IsReadOnly="True">
<DataGrid.InputBindings>
<KeyBinding Key="C" Modifiers="Ctrl" Command="{Binding Path=DataContext.CopyToClipBoardCommand}" CommandParameter="{Binding }" />
</DataGrid.InputBindings>
<DataGrid.Columns>
<!--Column 1-->
<DataGridTextColumn Binding="{Binding MobileName}" Header="Name" />
<!--Column 2-->
<DataGridTextColumn Binding="{Binding MobileOS}" Header="OS" />
</DataGrid.Columns>
</DataGrid>
注意:请勿更改DataGrid中的 SelectionUnit
请提供您的解决方案,如何根据键盘导航传递单元信息
与XAML DataGrid关联的C#源代码
public class GridViewModel
{
public ObservableCollection<MobileInfo> MobileList { get; set; }
public GridViewModel()
{
MobileList = new ObservableCollection<MobileInfo>();
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; }
}
答案 0 :(得分:1)
您可以将命令参数绑定到DataGrid.CurrentCell
属性。有几种方法可以实现这一点,其中一种方法是指定绑定的相对来源:
<KeyBinding Key="C"
Modifiers="Control"
Command="{Binding CopyToClipBoardCommand}"
CommandParameter="{Binding CurrentCell, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" />
请注意,我从命令绑定路径中删除了DataContext.
部分(如果未明确指定source,则DataContext
是绑定的默认源。)
命令参数现在将是DataGridCellInfo
类型的对象,它是结构,而不是类。
您可以修改命令参数绑定路径以提取更具体的信息。
答案 1 :(得分:1)
您只需在DataGrid xaml中使用CurrentCellChanged事件。
CurrentCellChanged="DataGrid_CurrentCellChanged"
...代码
private void DataGrid_CurrentCellChanged(object sender, EventArgs e)
{
var grid = sender as DataGrid;
var cell = grid.CurrentCell.Item;
}