看看这个例子:
我创建了一个自定义控件,其中集合作为依赖项属性,并使用子项填充集合的项目,从而获取绑定中的值。如果我创建具有固定值的子项,一切正常,如果我绑定它们的值,我会遇到绑定错误。
这是具有只读依赖项属性的用户控件:
public partial class UserControl1 : UserControl
{
private static DependencyPropertyKey TextsPropertyKey = DependencyProperty.RegisterReadOnly("Texts", typeof(ItemCollection), typeof(UserControl1), new FrameworkPropertyMetadata(new ItemCollection()));
public static DependencyProperty TextsProperty = TextsPropertyKey.DependencyProperty;
public ItemCollection Texts
{
get
{
return (ItemCollection)GetValue(TextsProperty);
}
set
{
SetValue(TextsProperty, value);
}
}
public UserControl1()
{
ItemCollection texts = new ItemCollection();
SetValue(TextsPropertyKey, texts);
InitializeComponent();
}
}
这是Window XAML:
<Window x:Class="ControlList.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ControlList="clr-namespace:ControlList"
Title="Window1" Height="300" Width="300">
<Grid>
<ControlList:UserControl1>
<ControlList:UserControl1.Texts>
<ControlList:ItemOfTheList Text="{Binding Text1}"></ControlList:ItemOfTheList>
<ControlList:ItemOfTheList Text="{Binding Text2}"></ControlList:ItemOfTheList>
</ControlList:UserControl1.Texts>
</ControlList:UserControl1>
</Grid>
</Window>
ItemOfTheList类只是一个带有字符串Dependency属性的对象:
public class ItemOfTheList : DependencyObject
{
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ItemOfTheList));
public string Text
{
get
{
return (string)GetValue(TextProperty);
}
set
{
SetValue(TextProperty, value);
}
}
public override string ToString()
{
return this.Text;
}
}
而item集合只是一个非泛型的FreezableCollection:
public class ItemCollection : FreezableCollection<ItemOfTheList>
{
}
这样我就会收到以下错误:
System.Windows.Data错误:2:找不到管理FrameworkElement 或目标元素的FrameworkContentElement。 BindingExpression:路径=文本1;的DataItem = NULL;目标元素是 'ItemOfTheList'(HashCode = 52697953); target属性是'Text'(类型 'String')System.Windows.Data错误:2:找不到管理 目标元素的FrameworkElement或FrameworkContentElement。 BindingExpression:路径=文本2;的DataItem = NULL;目标元素是 'ItemOfTheList'(HashCode = 22597652); target属性是'Text'(类型 '字符串')
如果我将ItemOfTheList更改为FrameworkElement,我总是在输出窗口得到DataContext为null。如何继承UserControl
对象中ItemOfTheList
的datacontext?