目前我遇到了绑定到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之外。
答案 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集合包含不同的派生类。只有在定位该集合的基类属性时,上述解决方案才有效。