绑定集合的子项的值

时间:2011-10-20 17:12:00

标签: c# wpf binding collections

看看这个例子:

我创建了一个自定义控件,其中集合作为依赖项属性,并使用子项填充集合的项目,从而获取绑定中的值。如果我创建具有固定值的子项,一切正常,如果我绑定它们的值,我会遇到绑定错误。

这是具有只读依赖项属性的用户控件:

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?

1 个答案:

答案 0 :(得分:1)

您的子项不属于逻辑树,因此无法参与绑定。有关如何纠正此问题的详细信息,请参阅我的博文here