2009-04-12 5 views
3

私はフォルダツリーのように動作するデータグリッドを実装しようとしています(つまり、各行はフォルダを表し、詳細ビューはフォルダ内のファイルを示す別のデータグリッドです)。私は簡単にするために私のコードをダウントリムしようとしたので、間違いがあるかもしれませんが、ここでは私の基本的なXAMLのレイアウトです:ボタンクリックからデータグリッドの詳細セクションを拡張するにはどうすればよいですか?

<my:DataGrid Name="dataGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}"> 
    <my:DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <my:DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:DataGrid}}, Path=SelectedItem.Files}" AutoGenerateColumns="False" HeadersVisibility="None"> 
       <my:DataGrid.Columns> 
        <my:DataGridTextColumn Binding="{Binding Path=FileName}" /> 
        <my:DataGridTextColumn Binding="{Binding Path=FSize}" /> 
       </my:DataGrid.Columns> 
      </my:DataGrid> 
     </DataTemplate> 
    </my:DataGrid.RowDetailsTemplate> 
    <my:DataGrid.Columns> 
     <my:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="16"> 
      <my:DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Click="Button_Click_1"> 
         <Image Source="resources/+.ico" /> 
        </Button> 
       </DataTemplate> 
      </my:DataGridTemplateColumn.CellTemplate> 
     </my:DataGridTemplateColumn> 
     <my:DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" /> 
    </my:DataGrid.Columns> 
</my:DataGrid> 

私はボタンが詳細行を拡大持つようにしようとしているが、私はよ行を参照する方法がわからない:

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     // how do I reference a row here? 
     DataGridRow row = ? 
     // so I can do this: 
     if (row.DetailsVisibility == Visibility.Collapsed) 
      row.DetailsVisibility = Visibility.Visible; 
     else 
      row.DetailsVisibility = Visibility.Collapsed; 
    } 

うまくいけば質問は明らかです...ありがとう。

答えて

6
private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     DependencyObject obj = (DependencyObject)e.OriginalSource; 
     while (!(obj is DataGridRow) && obj != null) 
      obj = VisualTreeHelper.GetParent(obj); 

     if(obj is DataGridRow) 
      (obj as DataGridRow).DetailsVisibility = Visibility.Visible; 
    } 

...らほら