web-dev-qa-db-ja.com

WPF DataGrid RowHeaderデータバインディング

DataTableにバインドされたDataGridがあります。 RowHeaderにテキストを表示して、次のようなものを実現したいと思います。

         Col0      Col1      Col2      Col3
Table |    1    |    3    |    5    |    6    |
Chair |    3    |    2    |    1    |    8    |

これは可能ですか?可能な場合、どうすればよいですか?

30
eriksmith200

私は両方の答えを試しましたが、どちらもうまくいきませんでした。基本的に私がしなければならなかったことはそれらを一緒に混ぜることでした。

これは私にとってはうまくいきます:

<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プロパティがあり、これも私がバインドしているものです。

34
markmuetz

それを行う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;
    }
}
5
denis morozov

このような行ヘッダーテンプレートを設定してみてください

<DataGrid>
        <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding YourProperty}"></TextBlock>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>uff

        //your stuff
</DataGrid>
2
michele

参考までに、データテーブルに直接バインドする場合、このバインドテキストは私にとってうまくいきました:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                                  AncestorType={x:Type DataGridRow}}, 
                                  Path=Item.Row.Header}

少しつついて、Item.Row.Headerパス、パスはDataGridRowで始まり、ItemDataGridViewに移動し、RowDataRow

繰り返しますが、データテーブルに直接バインドする場合。

1
Bryan Johnson

AncestorTypeをDataGridではなくDataGridRowに変更するだけで、行ヘッダーは行ごとに異なります。

0
user1680868

@michele:バインディングを次のように変更した場合:

<TextBlock Text="{Binding DataContext.YourProperty, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"/> 

その後、ほとんど機能します。問題は、これにより各行の行ヘッダーが同じになることです。

0
eriksmith200