如何制作自定义WPF集合?

时间:2009-07-16 01:25:53

标签: .net wpf xaml collections

我正在尝试创建一组可以通过XAML添加到WPF控件的自定义类。

我遇到的问题是将项目添加到集合中。这是我到目前为止所拥有的。

public class MyControl : Control
{
    static MyControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
    }

    public static DependencyProperty MyCollectionProperty = DependencyProperty.Register("MyCollection", typeof(MyCollection), typeof(MyControl));
    public MyCollection MyCollection
    {
        get { return (MyCollection)GetValue(MyCollectionProperty); }
        set { SetValue(MyCollectionProperty, value); }
    }
}

public class MyCollectionBase : DependencyObject
{
    // This class is needed for some other things...
}

[ContentProperty("Items")]
public class MyCollection : MyCollectionBase
{
    public ItemCollection Items { get; set; }
}

public class MyItem : DependencyObject { ... }

和XAML。

<l:MyControl>
    <l:MyControl.MyCollection>
        <l:MyCollection>
            <l:MyItem />
        </l:MyCollection>
    </l:MyControl.MyCollection>
</l:MyControl>

例外是:
System.Windows.Markup.XamlParseException occurred Message="'MyItem' object cannot be added to 'MyCollection'. Object of type 'CollectionTest.MyItem' cannot be converted to type 'System.Windows.Controls.ItemCollection'.

有人知道如何解决这个问题吗?感谢

2 个答案:

答案 0 :(得分:3)

经过更多的谷歌搜索,我发现this博客有相同的错误消息。似乎我也需要实现IList。

public class MyCollection : MyCollectionBase,  IList
{
    // IList implementation...
}

答案 1 :(得分:1)

您是否忘记在ItemCollection的构造函数中创建MyCollection的实例,并将其分配给Items属性?要使XAML解析器添加项,它需要一个现有的集合实例。它不会为您创建一个新的(但如果collection属性具有setter,它将允许您在XAML中显式创建一个)。所以:

[ContentProperty("Items")]
public class MyCollection : MyCollectionBase
{
    public ObservableCollection<object> Items { get; private set; }

    public MyCollection()
    {
         Items = new ObservableCollection<object>();
    }
}