none
Проблема с Attached Property и типом коллекции. RRS feed

  • Вопрос

  • Здравствуйте,

    Возникла проблема с Attached Properties. Есть статический класс, который имеет одно прикрипляемое свойство с типом коллекции. По умолчанию значение этого свойства в метаданных устанавливается в null. Но в методе GetAttachedPropertyName если свойству не назначена коллекция, то создается, устанавливается и возвращается. Сама проблема заключается в том что, если в редакторе XAML (Visual Studio) прикрепить данное свойство к какому либо объекту, то редактор сообщает о том что свойство имеет значение null. В результате в коллекцию ничего не добавляется. Хотя по идее парсер XAML должен вызывать метод GetAttachedPropertyName в котором создается экземпляр данной коллекции. Редактор XAML выводит сообщение такого вида:

    Cannot create an instance of the 'VisualObjectCollection'.

    Если запустить программу, возникает исключение XamlParserException и если смотреть стек:

       at System.Xaml.XamlObjectWriter.WriteGetObject()
       at System.Xaml.XamlWriter.WriteNode(XamlReader reader)
       at System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
       at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)


    Простенький класс:


    public static class VS
    {
    static VS()
    {
    VisualObjectsProperty = DependencyProperty.RegisterAttached("VisualObjects", typeof(VisualObjectCollection), typeof(VS), new PropertyMetadata(OnVisualObjectsChanged));

    }

    public static readonly DependencyProperty VisualObjectsProperty;

    public static VisualObjectCollection GetVisualObjects(DependencyObject element)
    {
    var result = (VisualObjectCollection)element.GetValue(VisualObjectsProperty);
    if (result == null)
    {
    result = new VisualObjectCollection();
    element.SetValue(VisualObjectsProperty, value);
    }
    return result;
    }

    private static void OnVisualObjectsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
    // Logic
    }
    }

    В чем может быть причина?

    С уважением,

    Владимир.




    20 марта 2013 г. 19:07

Ответы

  • Решение найдено, но не оптимальное. Если в конструкторе свойства указать имя отличимым от объявляемого имени - то парсер XAML вызывает нужный метод. Например:

    VisualObjectsProperty = DependencyProperty.RegisterAttached("VisualObjectsInternal", propertyType, ownerType, new PropertyMetadata(OnVisualScriptsChanged));

    Кто нибудь может объяснить причину такого поведения?
    20 марта 2013 г. 19:49

Все ответы

  • P.S. Простое создание коллекции или вызов метода GetVisualObjects не создает никаких исключений. Что предположение у меня, что что-то не так с парсером XAML.
    20 марта 2013 г. 19:33
  • Решение найдено, но не оптимальное. Если в конструкторе свойства указать имя отличимым от объявляемого имени - то парсер XAML вызывает нужный метод. Например:

    VisualObjectsProperty = DependencyProperty.RegisterAttached("VisualObjectsInternal", propertyType, ownerType, new PropertyMetadata(OnVisualScriptsChanged));

    Кто нибудь может объяснить причину такого поведения?
    20 марта 2013 г. 19:49