私は、WPF グリッド (WPFToolKit DataGrid) 用の一般的な CellTemplate スタイルをいくつかまとめていますが、バインディングを一般的にするために使用する構文がわかりません。たとえば、値が負の場合に値を赤に変える次のテンプレートがあります。
<DataTemplate x:Key="RedNegativeCellTemplate">
<TextBlock Name="QuantityTextBox" Text="{Binding Quantity, StringFormat='c', Mode=OneWay}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Quantity, Converter={StaticResource SignConverter}}" Value="-1">
<Setter TargetName="QuantityTextBox" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
これには、テキスト ボックスが列の値 '<em>Quantity' にバインドされていることがわかります。つまり、バインド元のフィールド/列は明示的です。
したがって、次のように WPF DataGrid でこれを使用できます。
<sdk:DataGrid ItemsSource="{Binding MyDataSource}" AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Net Quantity" CellTemplate="{StaticResource RedNegativeCellTemplate}"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
しかし…私が本当にやりたいのは、テンプレートのフィールドバインディングをジェネリックにすることです。これにより、次のようにテンプレートを再利用できます。
<sdk:DataGrid ItemsSource="{Binding OrdersQuery}"AutoGenerateColumns="False">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Quantity" CellTemplate="{StaticResource RedNegativeCellTemplate}"/>
<sdk:DataGridTemplateColumn Header="Price" CellTemplate="{StaticResource RedNegativeCellTemplate}"/>
<sdk:DataGridTemplateColumn Header="Total" CellTemplate="{StaticResource RedNegativeCellTemplate}"/>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
さて、ここでの問題は、CellTemplate でバインディングをパラメーター化する方法がないように見えることです。しかし、このテンプレートを使用するすべての列に 3 行以上の controltemplate が必要になるのは嫌です。XAML が乱雑になり、読みにくくなるためです (セル テンプレートを変更して配置することにした場合、テキストボックスの周りの境界線、複数の場所で変更する必要があります。
したがって、CellTemplate 内のバインディングは次のようになるはずだと考えています (バインディング パスに「.」を使用していることに注意してください)。
Text="{Binding Path=., StringFormat='c', Mode=OneWay}"
そして、どうにかして DataGridTemplateColumn 宣言からデータ コンテキストを設定しますが、その方法がわかりません。
これを行う方法はありますか?