2009-07-15 81 views
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); } 
    } 
} 

现在我数据绑定,为一个标签控件使用下面的代码为什么不能将WPF绑定到UserControl属性?

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> 

能正常工作和标签“一”,选项卡控件上显示“两个”。但是,如果我将Meh的基类型从DependencyObject更改为UserControl,则选项卡为空。为什么是这样?

回答

1

我就遇到了这个问题为好,我刚刚发现这一点:

Binding for TabItem's content controls

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

显然,这对彼得来说有点晚,但也许会帮助下一个人在这个问题上磕磕绊绊。

2

编辑

我检查你的代码,它似乎是在运行时,的TabItem的ContentPresenter不尽快继承了TabControl的DataContext的显示项目的类型是视觉还是从它衍生出来的。

这听起来像一些TabControl有趣的行为,因为用ListBox替换TabControl工作正常。 至于问题的具体原因,这对我来说并不明显。

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

相关问题