Выбор ячейки таблицы данных WPF, которая находится внутри RowDetailsTemplate - PullRequest
0 голосов
/ 07 декабря 2010

Я испытываю какое-то странное поведение в моей сетке данных, когда у меня есть вторая сетка данных как шаблон строки.Основная сетка данных связана с моей коллекцией элементов, а сетка данных деталей связана с коллекцией подэлементов, содержащихся в элементе.Теперь все это прекрасно отрисовывается, но когда я хочу щелкнуть ячейку в SubItemsGrid напрямую, она сначала выбирает первую ячейку строки в основной сетке, в которой содержится SubItemsGrid.Мне нужно щелкнуть второй раз, чтобы добраться до ячейки, которую я хочу выбрать.

Кто-нибудь также испытал это?И если да, есть ли обходной путь?

Это моя наценка (частично):

<DataGrid x:Name="ItemGrid" ItemsSource="{Binding Path=Items}" AutoGenerateColumns="False" SelectionUnit="Cell"
          RowDetailsVisibilityMode="Visible" CanUserResizeRows="False" AreRowDetailsFrozen="False" VerticalAlignment="Top"
          CanUserAddRows="False" CanUserDeleteRows="False" VerticalScrollBarVisibility="Hidden">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Column1" Binding="{Binding Path=ID}" Width="350"/>
        <DataGridTextColumn Header="Column2" Binding="{Binding Path=Name}" Width="80"/>
        <DataGridTextColumn Header="Column3" Binding="{Binding Path=Description}" Width="80"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid x:Name="SubItemsGrid" ItemsSource="{Binding Path=SubItems}" AutoGenerateColumns="False"
                      SelectionUnit="Cell" HeadersVisibility="None" Margin="50,0,0,0" VerticalAlignment="Top" CanUserAddRows="False" 
                      CanUserResizeRows="False" CanUserDeleteRows="False" BorderThickness="0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Column1" Binding="{Binding Path=Name}" Width="300" />
                    <DataGridTextColumn Header="Column2" Binding="{Binding Path=Description}" Width="80"/>
                    <!-- Etc.--> 

--- EDIT ---

Хорошо, явозникла идея обработать событие mouseUp в SubItemsGrid, а затем установить фокус на SubItemsGrid в коде, например так:

private void SubItemsGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.Focus()
   }
}

Отладка показывает, что вызывается метод 'Focus'правильная сетка, но я не получаю никаких визуальных результатов.Однако я чувствую, что я очень близок к решению.Кто-нибудь? * * 1013

1 Ответ

0 голосов
/ 10 декабря 2010

Я исправил это, перехватив событие «SelectedCellsChanged» в SubItemsGrid.В обработчике я вызвал BeginEdit () в сетке, которая вызвала событие.Это действительно делает акцент непосредственно на ячейке, по которой щелкнули, но также переводит ячейку в режим редактирования.Вот почему я вызвал CancelEdit () сразу после.Это сохранит фокус на ячейке, но не в режиме редактирования.

private void SubItemsGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
   DataGrid selectedGrid = sender as DataGrid;
   if (selectedGrid != null)
   {
       selectedGrid.BeginEdit();
       selectedGrid.CancelEdit();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...