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

时间:2016-01-12 08:11:33

标签: c# wpf xaml datagrid key-bindings

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

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

Cell Selected in OS Column

在上面的屏幕截图中选择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; }
}

2 个答案:

答案 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;
        }