Вопрос

Я пишу .NET3.5, приложение WPF, используя библиотеку составных приложений.Приложение разделено на несколько модулей.

В модуле инфраструктуры я определил объект NetworkNode.Модуль Network управляет коллекцией NetworkNodes и использует XmlSerializer для хранения/загрузки этой коллекции.Пока все работает.

Но у меня есть другие модули, например NodeModule.Если в модуле Network был выбран NetworkNode, событие публикуется в других модулях с помощью EventAggregator.Эти модули могут прикреплять различную информацию к NetworkNode, используя присоединенные свойства.

Проблема в том, что NetworkModule не знает о других модулях, поэтому эти свойства не сериализуются.Можно ли как-то перечислить и сериализовать все свойства, прикрепленные к объекту?Или мне придется изменить концепцию и использовать что-то еще, кроме прикрепленных свойств?

С уважением

Это было полезно?

Решение

Вы можете перечислить все свойства зависимостей (присоединенные или нет), определенные для объекта, используя DependencyObject.GetLocalValueEnumerator :

    LocalValueEnumerator propEnumerator = foo.GetLocalValueEnumerator();
    while (propEnumerator.MoveNext())
    {
        Console.WriteLine ("{0} = {1}",
                           propEnumerator.Current.Property.Name,
                           propEnumerator.Current.Value);
    }

Однако это не поможет для сериализации XML (если вы не реализуете IXmlSerializable, что доставляет неудобства...).Вероятно, вам следует использовать XamlWriter вместо этого (я полагаю, именно об этом и говорил Дрю, поскольку нет XamlSerializer...)

Другие советы

Поскольку присоединенные свойства не видны с точки зрения чистой среды CLR, XmlSerializer не имеет возможности узнать о них.Вам потребуется переключиться на использование архитектуры XamlSerializer, чтобы иметь возможность сериализовать как «простые» объекты CLR, так и иметь специальные знания о DependencyObjects.

Если вы используете .Net 4.0 (я думаю, их нет в .Net 3.5)

Вы можете использовать либо IattachedPropertyStore или AttachablePropertyServices

Справочный пример № 1: http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

Кроме того, как правило, присоединенное свойство должно быть определено правильно:

  1. Оно должно быть свойством общедоступного (или внутреннего в некоторых сценариях) невложенного типа (т. е.он не объявлен внутри другого типа), T.
  2. Определите новый AttachableMemberIdentifier(T, «MyProperty»)
  3. Предоставьте общедоступные статические методы для T под названием «SetMyProperty» и «GetMyProperty», т.е.часть MyProperty должна соответствовать вашему AttachableMemberIdentifier.(Вы не можете использовать «Foo» в качестве имени в AttachableMemberIdentifier и называть их «SetBar» и «GetBar», поскольку стек сериализатора Xaml должен найти их путем отражения.) Затем эти методы должны использовать AttachablePropertyServices для хранения значения прикрепленного свойства. .

Справочный пример № 2: http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top