能否在资源中对DataGrid的CellTemplate进行参数化绑定?

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>

你会注意到这个文本框有一个绑定到列值“数量”的绑定 - 也就是说,绑定来自的字段/列是明确的。
所以我可以在我的WPF数据表格中使用它,如下所示:
<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行以上的控制模板,因为这会使XAML杂乱无章且难以阅读(更不用说如果我决定在文本框周围添加边框来更改单元格模板,我需要在多个地方进行修改)。所以我认为,CellTemplate中的绑定应该像这样:(请注意,我们在绑定路径中使用“.”)
            Text="{Binding Path=., StringFormat='c', Mode=OneWay}"

然后,一些如何从DataGridTemplateColumn声明中设置数据上下文的方式——但我不知道如何做到这一点。

有任何想法如何实现吗?


这是一个困难的问题,一个可能的想法是创建一个名为ParameterizedDataGridTemplateColumn的类,只添加一个称为ContentBindingName的DependencyProperty,然后在datatemplate内部使用relativesource绑定。不过,由于继承DataGridTemplateColumn并不是非常直观的,所以这将是困难的。 - jimmyjambles
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。


0

你可以使用DataTemplateSelector来实现这个功能,它其实非常简单。
如果你需要更多的解释和示例,请告诉我。


哦,那很好。因此基本上编写DataTemplateSelector并将其分配给XAML中的CellTtemplateSelector,它可以根据某些逻辑以编程方式应用正确的模板?唯一的问题是,逻辑是否必须在DataTemplateSelector的code-behind中,还是可以使用触发器或类似的东西在XAML中定义逻辑?如果您有任何示例,我将非常感激。 - Webreaper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接