Как воспроизвести текст, отображаемый в TreeViewItem, при использовании ControlTemplate?

Я пытаюсь изменить TreeView для отображения значений TreeViewItem выше и ниже их дочерних элементов, например:

foo
|bar
||baz
|biz

станет

foo
|bar
||baz
| baz
|bar
|biz
 biz
foo

Ниже приводится усеченное представление текущего шаблона элемента управления без гарантии, что этот фрагмент компилируется:

<ControlTemplate TargetType="{x:Type TreeViewItem}">
  <Grid>
     <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="19"
                          Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto"/>
         <RowDefinition/>
         <RowDefinition Height="Auto"/>
      </Grid.RowDefinitions>
      <ToggleButton x:Name="Expander"
                    IsChecked="{Binding Path=IsExpanded,
                    RelativeSource={RelativeSource TemplatedParent}}"
                    ClickMode="Press"/>
      <Border Name="Bd"
              Grid.Column="1"
              Background="{TemplateBinding Background}"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}"
              Padding="{TemplateBinding Padding}">
        <ContentPresenter x:Name="PART_Header"
                          ContentSource="Header"
                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
      </Border>
      <ItemsPresenter x:Name="ItemsHost"
                      Grid.Row="1"
                      Grid.Column="1"
                      Grid.ColumnSpan="2"/>
      <TextBlock Text="Some Binding Goes Here"
                 Grid.Row="2"
                 Grid.Column="1"
                 Grid.ColumnSpan="2"/>
    </Grid>
  </ControlTemplate>

Повторяющиеся записи не будут иметь потомков, это будет просто отображаемое значение. Пока что я могу изменить TreeView ContainerStyle с помощью ControlTemplate, чтобы вставить TextBlock в соответствующее место в визуальном дереве. Какую привязку данных следует использовать для получения соответствующего отображаемого значения?


person Erick    schedule 03.10.2012    source источник
comment
Откуда берутся ценности в отношении того, к чему вы хотите это привязать ..? у вас есть какой-нибудь код, который вы на самом деле пробовали самостоятельно ..?   -  person MethodMan    schedule 03.10.2012
comment
TreeView привязан к XmlDocument и заполняется HierarchicalDataTemplate. Я воспроизведу часть шаблона управления выше.   -  person Erick    schedule 03.10.2012


Ответы (1)


Почему бы снова не использовать ContentPresenter?

<ContentPresenter ContentSource="Header"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  Grid.Row="2"
                  Grid.Column="1"
                  Grid.ColumnSpan="2"/>
person LPL    schedule 03.10.2012
comment
Но какой источник контента вы бы использовали? Заголовок фиксирован для всего TreeView, не так ли? - person Erick; 04.10.2012
comment
Нет, у каждого TreeViewItem есть собственный заголовок. Это ярлык, например foo / bar / biz или изображение, если хотите. С помощью приведенного выше кода вы просто дублируете содержимое этого заголовка в выбранном месте в шаблоне. Попробуйте! - person LPL; 04.10.2012
comment
Я понял, что это то, к чему вы клонили в душе этим утром. Спасибо, дам знать, как дела. - person Erick; 04.10.2012
comment
Это привело к неправильному пониманию того, как визуализируется TreeViewItem. Значение, которое вы устанавливаете в ItemsTemplate, - это заголовок, а ItemsPresenter - это тело HeaderedContentControl. Соглашения об именах, которые они используют для свойств, не помогают в этом. - person Erick; 04.10.2012