DataTableにバインドされたDataGridがあります。 RowHeaderにテキストを表示して、次のようなものを実現したいと思います。
Col0 Col1 Col2 Col3
Table | 1 | 3 | 5 | 6 |
Chair | 3 | 2 | 1 | 8 |
これは可能ですか?可能な場合、どうすればよいですか?
私は両方の答えを試しましたが、どちらもうまくいきませんでした。基本的に私がしなければならなかったことはそれらを一緒に混ぜることでした。
これは私にとってはうまくいきます:
<DataGrid name="ui_dataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Header}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
トリックは、祖先DataGridRow
を見つけ、次にTextBlock.Text
属性を気になるItemのプロパティにバインドします。この場合はHeader
(XAMLでは英語よりも簡単に言っているかもしれません) 。
次に、.xaml.csで:
ui_dataGrid.ItemsSource = dataSource.Rows;
N.B.各Row
オブジェクトにはHeader
プロパティがあり、これも私がバインドしているものです。
それを行う2つの方法、前の例にはほとんどありましたが、式に "DataContext"がないため、バインディングはプロパティを解決できませんでした。
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding DataContext.YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<!--your stuff-->
</DataGrid>
それを行う2番目の方法は、バインディングを取得するコンバーターを作成し、コンバーターで解析して、必要な文字列値を吐き出すことです。
<Views:DataGridRowDataContextToRowHeaderValueConverter x:Key="toRowHeaderValue"/>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Converter={StaticResource toRowHeaderValue}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
サンプルコンバーターコード:
public class DataGridRowDataContextToRowHeaderValueConverter : IValueConverter
{
public object Convert (object value, Type targetType, object parameter,
CultureInfo culture)
{
var dataGridRow = (DataGridRow) value;
var row = (GridModelExtensions.HourRow) dataGridRow.DataContext;
return row.Days[0].Hour;
}
}
このような行ヘッダーテンプレートを設定してみてください
<DataGrid>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding YourProperty}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>uff
//your stuff
</DataGrid>
参考までに、データテーブルに直接バインドする場合、このバインドテキストは私にとってうまくいきました:
{Binding RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type DataGridRow}},
Path=Item.Row.Header}
少しつついて、Item.Row.Header
パス、パスはDataGridRowで始まり、Item
はDataGridViewに移動し、Row
はDataRow。
繰り返しますが、データテーブルに直接バインドする場合。
AncestorTypeをDataGridではなくDataGridRowに変更するだけで、行ヘッダーは行ごとに異なります。
@michele:バインディングを次のように変更した場合:
<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/>
その後、ほとんど機能します。問題は、これにより各行の行ヘッダーが同じになることです。