我正在为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 - 但我看不到如何做到这一点。
知道怎么做吗?
答案 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
,这实际上非常简单。
如果您需要进一步的解释和示例 - 请告诉我。