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:如果我正确理解了您的想法,那么您和我将遇到相同的问题。我没有尝试过我的解决方案版本,基本上,我将绑定的路径属性绑定到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>

我稍后会检查并更新它。我希望这个想法在某种程度上有所帮助。我可能会调查 Dyna

于 2012-09-18T02:47:51.347 回答
0

为此,您可以使用DataTemplateSelector它实际上很容易实现。
如果您需要一些进一步的解释和示例 - 请告诉我。

于 2012-08-13T15:02:10.677 回答