Фокусировка ячейки сетки данных, когда фокус находится в пределах - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть сетка данных, для которой IsTabStop имеет значение false для стиля DataGridCell.Это было сделано, чтобы не фокусироваться на каждой ячейке сетки данных при нажатии клавиши tab.

Теперь я могу сфокусироваться на гиперссылках и переключателях, нажав клавишу tab, но строка не выделяется, когда я это делаю.Я пробовал следующий код:

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

Хотя, похоже, этот код не действует.Пожалуйста, предложите любые возможные обходные пути.

1 Ответ

0 голосов
/ 20 февраля 2012

Вы должны использовать свойство SelectedItem сетки данных. Конечно, убедитесь, что SelectionUnit не установлен на «ячейку»

Попробуйте это:

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

EDIT:

Если вам нужно что-то более пригодное для повторного использования, я предлагаю использовать прикрепленное поведение. В этом случае я бы создал прикрепленное поведение, которое будет использоваться в самой сетке данных:

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

Это код, он будет отслеживать изменения в событии 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;
        }
    }
}

В случае выбора нескольких ячеек будет выбрана строка последней ячейки. Вы можете изменить это в соответствии со своими потребностями.

...