Привязка к элементу в шаблоне DataTemplate TabControl

В настоящее время у меня проблема с привязкой к элементу, который находится в шаблоне DataTemplate TabControl.

TabControl работает отлично и отображает слово «Тест». Элемент, к которому я хочу привязаться, - это метка. ПРИМЕЧАНИЕ. Я не хочу привязывать содержимое ярлыка к модели представления, я хочу привязать его к содержимому ярлыка, потому что это может быть не только текст, но и другое содержимое.

<ContentPresenter Content="{Binding Path=Content, ElementName=MyLabel}" />
<TabControl x:Name="MyTabControl" ItemsSource="{Binding Path=LogPanels}">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Path=Title}" />
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate DataType="{x:Type viewModels:MyLogPanelViewModel}">
         <Label x:Name="MyLabel" Content="Test" />
      </DataTemplate>
      <!-- Several other DataTemplates. -->
   </TabControl.ContentTemplate>
</TabControl>

Очевидно, это не работает, и Visual Studio 2013 отображает сообщение в окне вывода:

Не удается найти источник привязки со ссылкой "ElementName = MyLabel". BindingExpression: Путь = Содержимое; DataItem = null; целевой элемент - ContentPresenter (Name = ''); целевым свойством является Content (тип Object)

Вопрос: Как лучше всего этого добиться?

Фоновая информация: это упрощенный случай, в последнем примере я бы хотел, чтобы Label был UserControl, который предоставляет собственную контекстную информацию (меню, кнопки и т. д.) для среды за пределами TabControl. .


person Herman Cordes    schedule 12.03.2015    source источник


Ответы (1)


Я предполагаю, что Content MyLabel - это свойство привязки к данным MyLogPanelViewModel, скажем, FooProperty.

В этом случае вам нужно изменить ContentPresenter, чтобы нацелить TabControl вместо Label. то есть:

ElementName=MyTabControl

И измените путь на:

Path=SelectionItem.FooProperty

Результат:

<ContentPresenter Content="{Binding Path=SelectedItem.FooProperty, ElementName=MyTabControl}" />
<TabControl x:Name="MyTabControl" ItemsSource="{Binding Path=LogPanels}">
   <TabControl.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Path=Title}" />
      </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
      <DataTemplate DataType="{x:Type viewModels:MyLogPanelViewModel}">
         <Label Content="{Binding FooProperty}" />
      </DataTemplate>
      <!-- Several other DataTemplates. -->
   </TabControl.ContentTemplate>
</TabControl>

Я не знаю деталей вашей реализации. Поскольку вы используете dataTemplates, класс MyLogPanelViewModel, вероятно, является производным типом, а ваша коллекция LogPanels содержит различные производные классы. Вышеупомянутое решение будет работать только в том случае, если вы нацелены на свойства базового класса этой коллекции.

person Mjollnir    schedule 12.03.2015
comment
Я должен был прямо упомянуть, что свойство Content не привязано к данным. Я действительно хочу привязаться к элементам на основе XAML, а не к данным. Ответ, который вы дали, действителен, хотя и с учетом вашего предположения. - person Herman Cordes; 12.03.2015
comment
Хорошо, может быть, есть что попробовать со свойством SelectedContentTemplate вместо SelectedItem. - person Mjollnir; 12.03.2015