Как программно выбрать строку или ячейку в WPF DataGrid? - PullRequest
9 голосов
/ 01 октября 2010

В WinForm DataGridView он автоматически выбирает первую строку при инициализации.Это сводило меня с ума, когда я пытался отключить эту функцию.Переходя на WPF DataGrid, похоже, что Microsoft решила отключить эту функцию, и я думаю, что это хорошая вещь.Тем не менее, мне сейчас трудно включить эту функцию.Для некоторых DataGrid я хочу, чтобы первая строка выбиралась автоматически после заполнения сетки через привязку данных.В Интернете есть несколько предложений, но я не смог сделать это.Я надеюсь на удачу здесь.

Ответы [ 4 ]

9 голосов
/ 01 октября 2010

Набор IsSynchronizedWithCurrentItem = "true".

EDIT:

Чтобы ответить на ваш комментарий, я предполагаю, что SelectionUnit вашего DataGrid имеет значение "Cell", не так ли? Хорошо, я не уверен, что это лучшее решение, но одну вещь, которую вы можете сделать, это обработать событие Loaded для DataGrid и вручную установить выбранную ячейку в коде. Итак, у вас будет что-то вроде этого:

<DataGrid x:Name="dg" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True"
            SelectedCellsChanged="dg_SelectedCellsChanged" SelectionUnit="Cell"
            Loaded="dg_Loaded">
    ...
</DataGrid>

Event-Handler:

private void dg_Loaded(object sender, RoutedEventArgs e)
{
    if ((dg.Items.Count > 0) &&
        (dg.Columns.Count > 0))
    {
        //Select the first column of the first item.
        dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[0]);
        dg.SelectedCells.Add(dg.CurrentCell);
    }
}

Обратите внимание, что это будет работать только в том случае, если для DataGrid.SelectionUnit установлено значение "Cell". В противном случае, я считаю, что это вызовет исключение.

EDIT2:

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>
        <Button Click="Button_Click">Reset</Button>
        <DataGrid x:Name="dg" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True"
                SelectionUnit="Cell"
                DataContextChanged="dg_DataContextChanged"
                ItemsSource="{Binding Items}"
                Loaded="dg_Loaded">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding}"/>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
</Window>

Code-Behind:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.LoadItems();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.LoadItems();
        }

        private void LoadItems()
        {
            this.DataContext = new { Items = new List<string> { "Item1", "Item2", "Item3" } };
            this.SelectFirstItem();
        }

        private void dg_Loaded(object sender, RoutedEventArgs e)
        {
            SelectFirstItem();
        }

        void SelectFirstItem()
        {
            if ((dg.Items.Count > 0) &&
                (dg.Columns.Count > 0))
            {
                //Select the first column of the first item.
                dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[0]);
                dg.SelectedCells.Add(dg.CurrentCell);
            }
        }

        private void dg_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            this.SelectFirstItem();
        }
    }
}
3 голосов
/ 01 декабря 2010

Вы можете сделать это последовательно в событии DataGrid.Loaded.Просто получите первую строку и заставьте строку инициировать событие выбора.

void MyGridLoaded(...) {
DataGridRow r = yourGrid.ItemContainergenerator.ContainerFromIndex(0) as DataGridRow;
  if(r != null) {
     r.IsSelected = false;
     r.IsSelected = true;
  }

} 

Я не уверен, что это ошибка, потому что вы не можете гарантировать, что события выбора будут запускаться из вашего объекта, пока элемент управления не будетзагружен.Не знаю.

1 голос
/ 03 октября 2010

Я рад сообщить, что нашел решение этой проблемы с помощью события ItemContainerGenerator.StatusChanged.

dataGrid.ItemContainerGenerator.StatusChanged += new EventHandler(ItemContainerGenerator_StatusChanged);

void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
        {
            if (dataGrid.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
            {
                dataGrid.SelectedIndex = 0;
            }
        }

Выглядит, когда это событие запускается со статусом ContainersGenerated, dataGrid полностью инициализируется.Для меня это больше похоже на событие DataBindingComplete DataGridView в WinForm.Если это так, событие "DataContextChanged" должно действительно называться событием "DataContextChanging".

Это было вдохновлено сообщением здесь , которое я случайно нашел, когда искал другую подсказку.1011 *

0 голосов
/ 01 октября 2010

Вы можете попробовать это.

        this.dataGrid.SelectionMode = DataGridSelectionMode.Single;

        // Selects the 4th row.
        this.dataGrid.SelectedIndex = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...