绑定到TabControl的DataTemplate中的元素

时间:2015-03-12 07:42:48

标签: .net wpf datatemplate tabcontrol contentpresenter

目前我遇到了绑定到TabControl的DataTemplate中的元素的问题。

TabControl完美运行并显示“测试”一词。我要绑定的元素是Label。 注意:我不想将标签的内容绑定到视图模型,我想绑定到标签的内容,因为它可能不仅是文本,还可能是其他内容。

<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 =''); target属性是'Content'(类型   '对象')

问题:实现这一目标的最佳方式是什么?

背景信息:这是一个简化的案例,在最后一个示例中,我希望Label为UserControl,它为环境提供了自己的上下文信息(菜单,按钮等)在TabControl之外。

1 个答案:

答案 0 :(得分:0)

我想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集合包含不同的派生类。只有在定位该集合的基类属性时,上述解决方案才有效。