2014-04-16 2 views
1

У меня есть следующий DataTemplate в ресурсах, которые я бы хотел использовать повторно в GridView.XAML: Пользовательская привязка в DataTemplate для использования в GridViewColumn CellTemplate

<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} и иметь GridViewColumn для привязки. Однако я не уверен, где и как это сделать, поскольку настройка DisplayMemberValue на {Binding MyLength} (например) просто переопределяет шаблон.

Я хотел бы сделать это полностью в XAML.

ответ

2

Похоже, что CellTemplate всегда будет игнорироваться, если у нас есть . Возможным обходным путем для этого ограничения является создание разметки-расширения, как указано @H.B в его ответе на аналогичный вопрос here. Создание разметки-расширения включает в себя коды C#/VB, но для его использования нужны коды XAML.

Вы можете использовать один и тот же код C# с расширением разметки, предоставленный @ H.B. Затем, чтобы использовать его в 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> 

Теперь вы можете использовать один и тот же DataTemplate для различных binidngs столбцов:

<GridView.Columns> 
    <GridViewColumn Header="MyLength" Width="80" 
      CellTemplate="{local:TemplateBuilder MyLength}" /> 
    <GridViewColumn Header="MyHeight" Width="80" 
      CellTemplate="{local:TemplateBuilder MyHeight}" /> 
</GridView.Columns> 
+0

Какой будет класс TemplateBuilder в этом случае. не могли бы вы рассказать нам схему того же –

Смежные вопросы