为什么WPF无法绑定到UserControl的属性?

4
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个回答

2

编辑

我已经检查了你的代码,似乎在运行时,如果要显示的项目是Visual类型或派生自它,则TabItem的ContentPresenter没有从TabControl继承DataContext。

这似乎是一些TabControl的有趣行为,因为用ListBox替换TabControl可以正常工作。至于问题的具体原因,我还不清楚。


1

我也遇到了这个问题,然后我找到了这个:

TabItem内容控件的绑定

看起来你可以创建一个ItemContainerStyle而不是使用ItemTemplate和ContentTemplate属性。我不知道为什么它有效,但对我有用。

显然,这对Peter来说有点晚了,但或许能帮助下一个遇到这个问题的人。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接