2016-07-06 18 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

DataGridDetailsPresenter内の別のDataGridのですか?完全なxamlをポストし、可能であればバインディングのサンプルビューモデルを投稿してください。 – 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> 

ハンドラ:

private void DataGridInner_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("DataGridInner_SelectionChanged_1 > Original source = " + ((DataGrid)sender).Name); 
    } 
+0

これは私がやっていることです。ビヘイビアを追加し、SelectionChangedイベントを処理します。私はイベントハンドラで親DataGridの選択をクリアします。しかし、これには2つの新しい問題があります。第1は、正しい状況を得るために非常にクリーンなコードではありません。ユーザーが子DataGridをクリックしたか、ユーザーが親DataGridの行を選択したかどうかを確認します。 2ndプライマリ選択が変更されます。そして私は古い選択を得る方法を見つけませんでした。 – Christopher

+0

こんにちは、私は選択を処理したくありません。私はそれを避けたい。子データグリッドから親DataGridへのクリックイベントをバブリングすることを避ける方法はありません。私はDataGridCellsPresenterとDataGridDetailsPresenterの間にボーダーを配置し、ClickイベントをキャッチするためにIsHitTestVisibleプロパティをtrueに設定することを考えました。しかし、私はそれを働かせなかった。この方法は可能であるべきだと思いますか? – Christopher

+0

@Christopher内部DataGridをButtonに配置し、この内部DataGridに対してIsHitTestVisibleをfalseに設定します。これがあなたの問題を解決するかどうかを確認してください。 – AnjumSKhan

関連する問題