为什么可以';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>