public class Meh : DependencyObject
{
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(string), typeof(Meh));
public string MyProperty
{
get { return (string)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
}
现在我使用以下代码将其数据绑定到选项卡控件
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var data = new List<Meh>();
data.Add(new Meh { MyProperty = "One" });
data.Add(new Meh { MyProperty = "Two" });
TabControlViews.ItemsSource = data;
}
}
选项卡控件的XAML如下所示
<TabControl Name="TabControlViews">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding MyProperty}"/>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
这样工作正常,标签控件上出现“One”,“Two”标签。但是,如果我将Meh的基本类型从DependencyObject更改为UserControl,则选项卡为空。这是为什么?
答案 0 :(得分:2)
修改
我已经检查了你的代码,似乎在运行时,TabItem的ContentPresenter不会从TabControl继承DataContext,因为要显示的项目是Visual类型或从它派生的。
这闻起来像一些TabControl有趣的行为,因为用ListBox替换TabControl工作正常。 至于问题的具体原因,对我来说并不明显。
答案 1 :(得分:1)
我也遇到了这个问题,我刚刚发现了这个问题:
Binding for TabItem's content controls
看起来不是使用ItemTemplate和ContentTemplate属性,而是可以创建ItemContainerStyle。我不知道它为什么会起作用,但它对我有用。
显然,这对彼得来说有点晚了,但也许它会帮助下一个人绊倒这个。
答案 2 :(得分:1)
问题在于ItemsControls的工作原理。对于ListBox,它的项目用ListBoxItem“包装”(假设该项不是ListBoxItem)。因此,如果将UserControl作为项添加到ListBox,它最终将以ListBoxItem.Content属性结束并显示。
使用TabControl,其项目用TabItem包装。与ListBoxItem不同,TabItem派生自HeaderedContentControl。因此,如果将UserControl作为项添加到TabControl,它最终将最终出现在TabItem.Content属性中并显示。
现在,如果要添加的项目不是可视化项目(例如DependencyObject),那么该项目也将分配给TabItem.Header属性。因此,在您的情况下,通过将基类从DependencyObject切换到UserControl,您将切换此行为。
视觉效果未设置为TabItem.Content和TabItem.Header的原因是因为它可能会在两个位置的可视树中结束,这很糟糕。
编辑:
此外,ItemTemplate传递给TabItem.HeaderTemplate,而不是TabItem.ContentTemplate(这是ListBoxItem的情况)。