是否可以在资源中参数化DataGrid CellTemplate上的绑定?

时间:2012-06-29 13:31:56

标签: wpf xaml binding datagrid celltemplate

我正在为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>

你会注意到它在文本框中有一个绑定到列值' 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声明中设置datacontext - 但我看不到如何做到这一点。

知道怎么做吗?

2 个答案:

答案 0 :(得分: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>

我稍后会检查并更新。我希望这个想法能以某种方式有所帮助。我可以看看Dyna

答案 1 :(得分:0)

为此,您可以使用DataTemplateSelector,这实际上非常简单。
如果您需要进一步的解释和示例 - 请告诉我。