Как избежать выбора DataGridRow в ParentDataGrid, щелкнув в DataGridDetailsPresenter?

У меня есть DataGrid (ParentDataGrid) с DataGridDetailsPresenter. В DataGridDetailsPresenter у меня есть еще один DataGrid (ChildDataGrid). Если я выбираю строку в ChildDataGrid, также выбирается окружающая DataGridRow объекта ParentDataGrid.

Я понимаю, что и ParentDataGrid, и ChildDataGrid генерируют событие SelectionChanged. Я попытался отменить выбор в ParentDataGrid. Но затем основной выбор в ParentDataGrid изменяется. Поэтому я не хочу выбирать DataGridRow в ParentDataGrid.

Как избежать выбора DataGridRow в ParentDataGrid, щелкнув в DataGridDetailsPresenter?

Это мой шаблон данных

<DataTemplate DataType="{x:Type MyViewModel}">
<DataTemplate.Resources>...
<Style TargetType="{x:Type DataGridRow}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridRow}">
                <Border ...>
                  <SelectiveScrollingGrid>
                      <SelectiveScrollingGrid.ColumnDefinitions>
                          <ColumnDefinition Width="Auto" />
                          <ColumnDefinition Width="*" />
                      </SelectiveScrollingGrid.ColumnDefinitions>
                      <SelectiveScrollingGrid.RowDefinitions>
                          <RowDefinition Height="*" />
                          <RowDefinition Height="Auto" />
                      </SelectiveScrollingGrid.RowDefinitions>

                      <DataGridRowHeader Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" .../>
                      <DataGridCellsPresenter Grid.Row="0" Grid.Column="1" .../>
                      <DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" .../>

                  </SelectiveScrollingGrid>
                </Border ...>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</DataTemplate.Resources>

<Grid ...>

<DataGrid x:Name="ParentDataGrid" ...>
    <DataGrid.Columns>...</DataGrid.Columns>

    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Grid ...>
                <DataGrid x:Name="ChildDataGrid"...>...</DataGrid>
            </Grid>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>

</DataGrid>

</Grid>
</DataTemplate>

person Christopher    schedule 06.07.2016    source источник
comment
Где еще один DataGrid в DataGridDetailsPresenter? Опубликуйте полный xaml и, если возможно, образец модели представления для привязки.   -  person AnjumSKhan    schedule 06.07.2016
comment
Дочерний DataGrid определен в DataGrid.RowDetailsTemplate. Я добавил имя сейчас. Этот дочерний DataGrid представлен в DataGridDetailsPresenter. ViewModel не важен. Я разместил его, чтобы показать, что использую DataTemplates. В обоих DataGrids есть несколько Items. Эти элементы могут быть независимыми.   -  person Christopher    schedule 06.07.2016
comment
Дочерний DG находится в DataTemplate RowDetailsTemplate, откуда ваш DataGridDetailsPresenter появляется на картинке.   -  person AnjumSKhan    schedule 06.07.2016
comment
Я воспроизвел ваш выпуск, посмотрю.   -  person AnjumSKhan    schedule 06.07.2016


Ответы (1)


Обработайте событие SelectedCellsChanged в родительском DataGrid.

private void DataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
        {
            DataGridRow row = (DataGridRow)DgrdParent.ItemContainerGenerator.ContainerFromItem(DgrdParent.SelectedItem);
            if (row != null)
                row.IsSelected = false;
        }

И если вы хотите получить выбранного потомка DataGrid, вы можете использовать его событие SelectionChanged.

    <DataGrid x:Name="DgrdParent" ItemsSource="{Binding .}" CurrentCellChanged="DgrdParent_CurrentCellChanged_1" RowDetailsVisibilityMode="Visible" SelectionChanged="DgrdParent_SelectionChanged_1" SelectedCellsChanged="DataGrid_SelectedCellsChanged_1" >
        <DataGrid.Resources>
            <Style TargetType="DataGridDetailsPresenter">
            </Style>
        </DataGrid.Resources>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid x:Name="DgrdChild" ItemsSource="{Binding Employees}" SelectionChanged="DataGridInner_SelectionChanged_1" />
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>            
    </DataGrid>

Обработчик:

   private void DataGridInner_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("DataGridInner_SelectionChanged_1 > Original source = " + ((DataGrid)sender).Name);
    }
person AnjumSKhan    schedule 06.07.2016
comment
Вот что я делаю. Я добавляю поведение и обрабатываю событие SelectionChanged. Я снимаю выделение родительского DataGrid в обработчике событий. Но здесь возникают две новые проблемы. 1-й Это не очень чистый код, чтобы получить правильную ситуацию. Щелкнул ли пользователь в дочернем DataGrid или же пользователь выбрал строку в родительском DataGrid. 2-й изменен первичный выбор. И я не нашел способа получить старую подборку. - person Christopher; 07.07.2016
comment
Привет, я не хочу обрабатывать выбор. Я хочу этого избежать. Нет способа избежать восходящей цепочки события щелчка из дочернего DataGrid в родительский DataGrid. Я подумал о том, чтобы установить границу между DataGridCellsPresenter и DataGridDetailsPresenter и установить для свойства IsHitTestVisible значение true, чтобы поймать событие Click. Но у меня не получилось. Как вы думаете, такой способ должен быть возможен? - person Christopher; 11.07.2016
comment
@Christopher Поместите свой внутренний DataGrid в кнопку и установите IsHitTestVisible в false для этого внутреннего DataGrid. Посмотрите, решит ли это вашу проблему. - person AnjumSKhan; 11.07.2016
comment
Я не могу выбрать строку во внутреннем DataGrid, если я установил IsHitTestVisible в false для внутреннего DataGrid. Если я не установлю для IsHitTestVisible значение false, это не изменит поведения. - person Christopher; 12.07.2016
comment
Я попробовал. Но тогда я не могу ничего выбрать во внутреннем DataGrid. Внутренний DataGrid отключается при любом щелчке. Мне нужно выбрать строки во внутреннем DataGrid. И если я нажимаю на внешний DataGrid, я хочу выбрать вещи во внешнем DataGrid. Оба должны быть возможными. - person Christopher; 18.07.2016