Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';WPF绑定到用户控件属性?_Wpf_Data Binding - Fatal编程技术网

为什么可以';WPF绑定到用户控件属性?

为什么可以';WPF绑定到用户控件属性?,wpf,data-binding,Wpf,Data Binding,现在,我使用以下代码将其数据绑定到选项卡控件 public class Meh : DependencyObject { public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(string), typeof(Meh)); public string MyProperty {

现在,我使用以下代码将其数据绑定到选项卡控件

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); }
    }
}
公共部分类窗口1:窗口
{
公共窗口1()
{
初始化组件();
var data=新列表();
data.Add(new Meh{MyProperty=“One”});
data.Add(new Meh{MyProperty=“Two”});
TabControlViews.ItemsSource=数据;
}
}
选项卡控件的XAML如下所示

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;
    }
}

这可以正常工作,选项卡控件上会显示选项卡“1”、“2”。但是,如果我将Meh的基本类型从DependencyObject更改为UserControl,则选项卡为空。为什么会这样?

编辑

我检查了您的代码,似乎在运行时,只要要显示的项是Visual类型或派生自它,TabItem的ContentPresenter就不会从TabControl继承DataContext

这闻起来像是TabControl的一些有趣行为,因为用ListBox替换TabControl效果很好。
至于问题的具体原因,我并不清楚。

我也遇到了这个问题,我刚刚发现:

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


显然,这对Peter来说有点晚了,但可能会帮助下一个在这个问题上结结巴巴的人。

问题在于ItemsControl如何工作。对于ListBox,它的项用ListBoxItem“包装”(假设该项不是ListBoxItem)。因此,如果将UserControl作为项添加到ListBox,它最终将位于ListBoxItem.Content属性中并显示

使用TabControl,其项将用TabItem包装。与ListBoxItem不同,TabItem派生自HeaderedContentControl。同样,如果您将UserControl作为项添加到TabControl中,它最终将位于TabItem.Content属性和present中

现在,如果要添加的项不是可视的(例如DependencyObject),那么该项也将被分配给TabItem.Header属性。因此,在您的例子中,通过将基类从DependencyObject切换到UserControl,您可以切换这种行为

视觉对象未同时设置为TabItem.Content和TabItem.Header的原因是,它可能会在视觉树中的两个位置结束,这是不好的

编辑:

此外,ItemTemplate被传递到TabItem.HeaderTemplate,而不是TabItem.ContentTemplate(ListBoxItem就是这种情况)

<TabControl Name="TabControlViews">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyProperty}"/>
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>