为什么WPF不能绑定到UserControl属性?

时间:2009-07-15 08:49:01

标签: wpf data-binding

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,则选项卡为空。这是为什么?

3 个答案:

答案 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的情况)。