Как сделать собственную коллекцию WPF? - PullRequest
3 голосов
/ 16 июля 2009

Я пытаюсь создать пользовательский набор классов, которые можно добавить в элемент управления WPF через XAML.

У меня проблема с добавлением предметов в коллекцию. Вот что у меня есть.

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 ]

3 голосов
/ 16 июля 2009

После еще одного поиска, я нашел этот блог с тем же сообщением об ошибке. Кажется, мне нужно реализовать IList.

public class MyCollection : MyCollectionBase,  IList
{
    // IList implementation...
}
1 голос
/ 16 июля 2009

Возможно, вы забыли создать экземпляр ItemCollection в конструкторе MyCollection и присвоить его свойству Items? Чтобы XAML-парсер мог добавлять элементы, ему нужен существующий экземпляр коллекции. Он не создаст новый для вас (хотя он позволит вам явно создать его в XAML, если у свойства коллекции есть установщик). Итак:

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

    public MyCollection()
    {
         Items = new ObservableCollection<object>();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...