4

私は、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 宣言からデータ コンテキストを設定しますが、その方法がわかりません。

これを行う方法はありますか?

4

2 に答える 2

1

@Webreaper:私があなたの考えを正しく理解していれば、あなたと私は同じことをしていることになります。私は自分のバージョンのソリューションを試していません。基本的に、バインディングのpathプロパティをDataGridTemplateColumnのSortMemberPathにバインドします。

<DataGrid>
....
     <DataGridTemplateColumn CellTemplate={StaticResource CellTemplateKey} />
....
</DataGrid>

CellTemplateKeyがどこかで定義されている場所(たとえば、App.xaml内):

<DataTemplate x:Key="CellTemplateKey">
    <TextBlock Binding="{Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}, Path={Binding Source={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridTemplateColumn, Path=SortMemberPath}}}}" />
</DataTemplate>

これは後で確認して更新します。このアイデアが何らかの形で役立つことを願っています。ダイナを調べてもいい

于 2012-09-18T02:47:51.347 に答える
0

DataTemplateSelectorこれには、実装が実際には非常に簡単な 方法を使用できます。
さらに説明と例が必要な場合は、お知らせください。

于 2012-08-13T15:02:10.677 に答える