Как сделать так, чтобы WPF Datagrid выбирал ячейку при первом входе в нее

Когда я вкладываюсь в WPF Datagrid, он фокусирует первую ячейку (с прямоугольником), но не выделяет ее (синим цветом). Если я снова нажму вкладку, он сфокусируется на , а выберет его.

Я думаю, что DataGridCell действительно имеет IsSelected = true, но не окрашивается в синий цвет. Я пробовал взломать сетку данных и визуальные состояния, но не могу заставить его правильно перерисовать сетку при первом входе.

Кто-нибудь видел это раньше и есть ли у вас решение?

код для воспроизведения :

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBox Width="100"/>
        <DataGrid SelectionMode="Single" SelectionUnit="Cell"
              ItemsSource="{Binding MyItems}" AutoGenerateColumns="True"/>
    </StackPanel>
</Window>

MainWindow.xaml.cs

using System.Collections.Generic;
using System.Windows;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MyItems.Add(new Thingy() { Name = "Frank", Age = 34 });
            MyItems.Add(new Thingy() { Name = "Jim", Age = 43 });
            MyItems.Add(new Thingy() { Name = "Bob", Age = 56 });
            MyItems.Add(new Thingy() { Name = "Harry", Age = 23 });

            DataContext = this;
        }

        private List<Thingy> _myItems = new List<Thingy>();
        public List<Thingy> MyItems
        {
            get { return _myItems; }
        }
    }

    public class Thingy
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

щелкните TextBox, затем нажмите вкладку --- ячейка 1 не выбрана

нажмите вкладку снова --- ячейка 2 выбрана

Любая помощь очень ценится, спасибо.

Обновление:

Когда SelectionUnit = FullRow, у меня был некоторый успех в строках, показанных ниже, если SelectedIndex установлен в 0 при создании, первая строка будет теперь выделена синим цветом. По-прежнему требуется некоторая работа, чтобы справиться со сдвигом вкладки и т. Д. Проблема все еще существует, потому что, когда я изменяю SelectionMode на расширенный и нажимаю Shift-Downarrow, выбирается вторая строка, но первая строка становится невыделенной (они должны быть выбраны обе) . Если я сделаю это снова, будут выбраны строки 2 + 3, что правильно, и после этого он продолжит работать нормально.

protected override void OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnIsKeyboardFocusWithinChanged(e);

        int oldIdx = this.SelectedIndex;
        this.SelectedIndex = -1;
        this.SelectedIndex = oldIdx;
    }

Дальнейшее обновление:

Эта проблема устранена путем установки частного поля _selectionAnchor. (Спасибо ILSpy)

 protected override void OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnIsKeyboardFocusWithinChanged(e);

        this.SelectedIndex = -1;
        this.SelectedIndex = 0;

        SelectionAnchor = SelectedCells[0];
    }

    protected DataGridCellInfo? SelectionAnchor
    {
        get
        {
            return typeof(DataGrid).GetField("_selectionAnchor", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as DataGridCellInfo?;
        }
        set
        {
            typeof(DataGrid).GetField("_selectionAnchor", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value);
        }
    }
10
задан Frank Wallis 6 December 2011 в 09:13
поделиться