Использование TemplateBinding внутри DataTemplates

Я создаю пользовательский элемент управления, и у меня возникают проблемы с привязкой элементов пользовательского интерфейса внутри DataTemplate к свойствам зависимостей пользовательского элемента управления.

В моем контроле есть элемент управления содержимым, который должен изменять его содержимое и шаблон содержимого в соответствии с определенным свойством, поэтому я связал его следующим образом:

<ContentControl Content="{TemplateBinding ControlMode}" ContentTemplateSelector="{StaticResource TemplateSelector}"/>

Селектор шаблона содержимого определяется следующим образом:

<ns:TemplateSelector x:Key="TemplateSelector">
      <ns:TemplateSelector.Template1>
         <DataTemplate>
            <TreeView ItemsSource="{TemplateBinding TreeSource}"/>
         </DataTemplate>
      </ns:TemplateSelector.Template1>
      <ns:TemplateSelector.Template2>
          <DataTemplate>
              <ListView ItemsSource="{TemplateBinding ListSource}"/>
          </DataTemplate>
      </ns:TemplateSelector.Template2>
</ns:TemplateSelector>

Проблема в том, что TreeView и ListView не могут быть связаны с их источником элементов с TemplateBinding из-за этой ошибки, например:

"Не удается найти TreeSourceProperty для типа ContentPresenter"

Я искал ответ, и нашел этот ответ, который просто заявляет, что это невозможно.

Как использовать привязку шаблона внутри шаблона данных в пользовательском элементе управления (Silverlight)

Так что, если это действительно невозможно, как еще можно связать элементы внутри моего шаблона с DependencyProperties пользовательского элемента управления?

Спасибо!

1 ответ

Решение

В WPF вы можете использовать привязку с RelativeSource нацеливание на "шаблонный" элемент управления.

например

{Binding TreeSource,
         RelativeSource={RelativeSource AncestorType=MyCustomControl}}

Изменить: Если у вас есть разрыв в дереве, вы можете обойти это, передавая этот контроль, например,

<ControlThatOwnsPopup
    Tag="{Binding RelativeSource={RelativeSource AncestorType=MyCustomControl}}">
     <Popup>...
<TreeView ItemsSource="{Binding PlacementTarget.Tag.TreeSource,
                                RelativeSource={RelativeSource AncestorType=Popup}}"/>
Другие вопросы по тегам