焦点在焦点内时聚焦数据网格单元

时间:2012-02-20 14:28:21

标签: wpf datagrid focus

我有一个DataGrid,对于DataGridCell样式,IsTabStop设置为false。这样做是为了避免在按Tab键时关注每个datagrid单元格。

现在,我可以通过按Tab键来关注超链接和单选按钮,但是当我这样做时,行不会被选中。我尝试了以下代码:

<Style TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="IsSelected" Value="True" />
        </Trigger>
    </Style.Triggers>
</Style>

虽然看起来这个代码没有效果。请提出任何可能的解决方法。

1 个答案:

答案 0 :(得分:0)

您应该使用datagrid的SelectedItem属性。当然,检查SelectionUnit未设置为“cell”

试试这个:

<Style TargetType="{x:Type DataGridCell}">
    <EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus"></EventSetter>
</Style>

如果myDatagrid是您的数据网格的名称:

private void DataGridCell_GotFocus(object sender, EventArgs e)
{
    DataGridCell cell = sender as DataGridCell;
    myDatagrid.SelectedItem = cell.DataContext;
}

修改

如果您需要更可重用的内容,我建议使用附加行为。在这种情况下,我将创建一个在数据网格本身中使用的附加行为:

<Style TargetType="{x:Type DataGrid}">
    <Setter Property="views:MyBehaviours.IsCellRowSelected" Value="true"></Setter>
</Style>

这是代码,它将监视datagrid的SelectedCellsChanged事件的更改:

public static class MyBehaviours
{
    public static bool GetIsCellRowSelected(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsCellRowSelectedProperty);
    }

    public static void SetIsCellRowSelected(DependencyObject obj, bool value)
    {
        obj.SetValue(IsCellRowSelectedProperty, value);
    }

    public static readonly DependencyProperty IsCellRowSelectedProperty =
      DependencyProperty.RegisterAttached("IsCellRowSelected",
      typeof(bool), typeof(MyBehaviours),
      new UIPropertyMetadata(false, OnIsCellRowSelected));

    static void OnIsCellRowSelected(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        DataGrid item = depObj as DataGrid;
        if (item == null)
            return;

        if (e.NewValue is bool == false)
            return;

        if ((bool)e.NewValue)
            item.SelectedCellsChanged += SelectRow;
        else
            item.SelectedCellsChanged -= SelectRow;
    }

    static void SelectRow(object sender, SelectedCellsChangedEventArgs e)
    {
        if (e.AddedCells.Count > 0)
        {
            DataGrid dg = sender as DataGrid;
            var cell = e.AddedCells.Last();
            dg.SelectedItem = cell.Item;
        }
    }
}

如果选择多个单元格,将选择最后一个单元格的行。您可以根据自己的需要进行修改。