我在资源中有以下DataTemplate,我想在整个GridView中重用它。
<Window.Resources>
<DataTemplate x:Key="NumericalDataTemplate" DataType="GridViewColumn.CellTemplate">
<StackPanel Orientation="Horizontal" Height="32">
<TextBlock Text="{Binding MyLength}" VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}" >
<Setter Property="Visibility" Value="Visible" />
<Style.Triggers>
<DataTrigger Binding="{Binding PropertyEditable}" Value="True">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
</Window.Resources>
实现如下。
<GridViewColumn Header="MyLength" Width="80"
CellTemplate="{StaticResource NumericalDataTemplate}" />
我想更改TextBlock的绑定(当前Text={Binding MyLength}
),以便它可以为每个GridViewColumn单元格模板使用自定义绑定(例如MyHeight,MyWeight等)。
我设想这样做的方法是将TextBlock的Binding更改为简单地使用{Binding}
并让GridViewColumn设置Binding。但是,我不确定在何处或如何执行此操作,因为将DisplayMemberValue设置为{Binding MyLength}
(例如)只是覆盖模板。
我最好在XAML中完全这样做。
答案 0 :(得分:2)
当我们设置CellTemplate
属性时,似乎总是会忽略DisplayMemberBinding
。此限制的可能解决方法是,通过@H.B在类似问题here的答案中创建标记扩展名。创建标记扩展涉及C#/ VB代码,但使用它只需要XAML代码。
您可以重复使用@ H.B提供的相同标记扩展C#代码。然后在XAML中使用它,声明名称空间前缀:
<Window ......
xmlns:local="clr-namespace:WpfProject">
修改DataTemplate
密钥并绑定TextBlock
内部:
<DataTemplate x:Key="TemplateBuilder_BaseTemplate" DataType="GridViewColumn.CellTemplate">
<StackPanel Orientation="Horizontal" Height="32">
<TextBlock Text="{local:TemplateBuilderTag}" VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}" >
<Setter Property="Visibility" Value="Visible" />
<Setter Property="Foreground" Value="Red"/>
<Style.Triggers>
<DataTrigger Binding="{Binding PropertyEditable}" Value="True">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
现在,您可以对不同的列binidng使用相同的DataTemplate
:
<GridView.Columns>
<GridViewColumn Header="MyLength" Width="80"
CellTemplate="{local:TemplateBuilder MyLength}" />
<GridViewColumn Header="MyHeight" Width="80"
CellTemplate="{local:TemplateBuilder MyHeight}" />
</GridView.Columns>