2016-07-06 3 views
0

DataGridDetailsPresenter가있는 DataGrid (ParentDataGrid)가 있습니다. DataGridDetailsPresenter에는 다른 DataGrid (ChildDataGrid)가 있습니다. ChildDataGrid에서 Row를 선택하면 ParentDataGrid의 주변 DataGridRow도 선택됩니다.DataGridDetailsPresenter를 클릭하여 ParentDataGrid에서 DataGridRow를 선택하지 않으려면 어떻게해야합니까?

ParentDataGrid와 ChildDataGrid가 모두 SelectionChanged 이벤트를 발생시킵니다. ParentDataGrid에서 선택을 취소하려고했습니다. 그러나 ParentDataGrid의 기본 선택이 변경됩니다. 따라서 ParentDataGrid에서 DataGridRow를 선택하지 않는 것이 좋습니다.

DataGridDetailsPresenter를 클릭하여 ParentDataGrid에서 DataGridRow를 선택하지 않으려면 어떻게해야합니까?

이 내 DataTemplate을

<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> 
+0

? 완전한 xaml을 게시하고 가능한 경우 바인딩을위한 샘플 viewmodel을 게시하십시오. – AnjumSKhan

+0

자식 DataGrid는 DataGrid.RowDetailsTemplate에 정의되어 있습니다. 이름을 지금 추가했습니다. 이 자식 DataGrid는 DataGridDetailsPresenter에 표시됩니다. ViewModel은 중요하지 않습니다. DataTemplates를 사용하고 있음을 보여주기 위해 게시했습니다. 두 DataGrid에는 몇 가지 항목이 있습니다. 이 항목들은 독립적 일 수 있습니다. – Christopher

+0

하위 DG는 DataGridDetailsPresenter가있는 RowDetailsTemplate의 DataTemplate에 있습니다. – AnjumSKhan

답변

0

핸들 부모 DataGridSelectedCellsChanged 이벤트입니다.

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> 

처리기 :

DataGridDetailsPresenter 다른 데이터 그리드가
private void DataGridInner_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("DataGridInner_SelectionChanged_1 > Original source = " + ((DataGrid)sender).Name); 
    } 
+0

이것은 내가하고있는 일이다. 비헤이비어를 추가하고 SelectionChanged 이벤트를 처리합니다. 이벤트 처리기에서 부모 DataGrid 선택을 취소합니다. 그러나 이것은 두 가지 새로운 문제를 야기합니다. 첫 번째는 정확한 상황을 파악하기위한 코드가 아닙니다. 사용자가 자식 DataGrid를 클릭했거나 사용자가 부모 DataGrid에서 행을 선택 했습니까? 둘째, 기본 선택이 변경됩니다. 그리고 이전 선택을 얻는 방법을 찾지 못했습니다. – Christopher

+0

안녕하세요, 선택을 처리하고 싶지 않습니다. 나는 그것을 피하고 싶다. 하위 DataGrid에서 부모 DataGrid로 click 이벤트를 버블 링하는 것을 방지 할 수있는 방법이 없습니다. 나는 DataGridCellsPresenter와 DataGridDetailsPresenter 사이에 테두리를 놓고 Click 이벤트를 잡기 위해 IsHitTestVisible 속성을 true로 설정하는 것에 대해 생각했습니다. 그러나 나는 그것을 작동시키지 않았다. 이 방법이 가능해야한다고 생각하십니까? – Christopher

+0

@Christopher 내부 DataGrid를 Button에 넣고이 내부 DataGrid에 대해 IsHitTestVisible을 false로 설정하십시오. 이것이 당신의 문제를 해결하는지보십시오. – AnjumSKhan