locked
DataGrid の RowDetails の表示を行ごとに変えたい RRS feed

  • 質問

  • 以下で、RowDetails を表示できることは確認しました。


    <sdk:DataGrid RowDetailsVisibilityMode="Visible"  ...>
      <sdk:DataGrid.RowDetailsTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Path=Name}" />
        </DataTemplate>
      </sdk:DataGrid.RowDetailsTemplate>
      
      <sdk:DataGrid.Columns>
        ....
      </sdk:DataGrid.Columns>
    </sdk:DataGrid>




    続いて、
    奇数行、偶数行で Template を変えようと思います。
    どうすれば可能でしょう?
    • 編集済み custar 2012年3月31日 11:09
    2012年3月31日 11:04

すべての返信

  • Does each row in a silverlight dataGrid have to have the same “RowDetailsTemplate”?


    <UserControl.Resources>
      <DataTemplate x:Key="evenTemplate">
        <TextBlock Text="{Binding Path=Name}" />
      </DataTemplate>
      <DataTemplate x:Key="oddTemplate">
        <TextBox Text="{Binding Path=Name}" />
      </DataTemplate>
    </UserControl.Resources>

    private void bDataGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
    {
    	int idx = e.Row.GetIndex();
    	if (idx % 2 != 0)
    	{
    		e.Row.DetailsTemplate = (DataTemplate)Resources["oddTemplate"];
    	}
    }


    • 編集済み custar 2012年3月31日 13:22
    2012年3月31日 13:20
  • Children がない場合は RowDetails を出さないようにしてみました。



    図1:D.Id = 2 に Children Fs がある場合



    図2:D.Id = 2 に Children Fs がない場合


    private void dDataGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
    {
    	var d = e.DetailsElement.DataContext as D;
    	if (d.Fs.Count > 0)
    	{
    		e.Row.DetailsTemplate = (DataTemplate)Resources["detailsTemplate"];
    	}
    }

    <UserControl.Resources>
      <DataTemplate x:Key="detailsTemplate"> ....................................... (1)
        <sdk:DataGrid ItemsSource="{Binding Path=Fs}" ...>
          <sdk:DataGrid.Columns>
            <sdk:DataGridTextColumn Binding="{Binding Path=DId}" Header="D Id" />
            <sdk:DataGridTextColumn Binding="{Binding Path=Name}" Header="F Name" />
          </sdk:DataGrid.Columns>
        </sdk:DataGrid>
      </DataTemplate>
    </UserControl.Resources>
    
    <Grid ...>
      <sdk:DataGrid ItemsSource="{Binding ElementName=dDomainDataSource, Path=Data}" ...>
        <sdk:DataGrid.RowDetailsTemplate>
          <DataTemplate> ........................................................... (2)
            <StackPanel></StackPanel>
          </DataTemplate>
        </sdk:DataGrid.RowDetailsTemplate>
        
        <sdk:DataGrid.Columns>
          <sdk:DataGridTextColumn Binding="{Binding Path=Id, Mode=OneWay}" Header="D Id" .../>
          <sdk:DataGridTextColumn Binding="{Binding Path=Value}" Header="D Value" .../>
        </sdk:DataGrid.Columns>
      </sdk:DataGrid>
      ...
    </Grid>


    本当は、
    予め (2) に (1) を設定しておき、Children がない時だけ 


    e.Row.DetailsTemplate = null

    としたかったが、そうすると、
    RowDetails に Children DataGrid の Header が残ってしまった。
    残らなければ、それがいいのだが。
    • 編集済み custar 2012年3月31日 14:18
    2012年3月31日 14:11
  • Children の有無で RowDetails を出す出さないって、
    xaml で出来そうな感じがするのですが、よくは分からない。

    以前教えてもらった DataTrigger や IValueConverter を使って。
    • 編集済み custar 2012年3月31日 16:00
    2012年3月31日 15:58