XAML:DataTemplate中的自定义绑定,用于GridViewColumn CellTemplate

时间:2014-04-16 09:03:54

标签: wpf xaml binding datatemplate

我在资源中有以下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中完全这样做。

1 个答案:

答案 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>