3

我正在使用复合应用程序库编写 .NET3.5、WPF 应用程序。应用程序分为几个模块。

在基础设施模块中,我定义了 NetworkNode 对象。Network 模块管理 NetworkNodes 的集合并使用 XmlSerializer 来存储/加载该集合。到目前为止一切正常。

但我还有其他模块,例如 NodeModule。如果在 Network 模块中选择了 NetworkNode,则使用 E​​ventAggregator 将事件发布到其他模块。这些模块可以使用附加属性将各种信息附加到 NetworkNode。

问题是 NetworkModule 不知道其他模块,因此这些属性没有序列化。是否可以以某种方式列出和序列化附加到对象的所有属性?还是我必须改变概念并使用附加属性以外的其他东西?

问候

4

3 回答 3

3

由于从纯 CLR 角度看附加属性是不可见的,因此 XmlSerializer 无法了解它们。您需要切换到使用 XamlSerializer 体系结构,以便能够序列化“普通”CLR 对象以及具有 DependencyObjects 的特殊知识。

于 2009-10-23T13:51:44.140 回答
3

您可以使用以下命令列出对象上定义的所有依赖项属性(附加或未附加)DependencyObject.GetLocalValueEnumerator

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

但是,这对 XML 序列化没有帮助(除非您实现 IXmlSerializable,这很痛苦……)。您可能应该XamlWriter改用(我认为这是 Drew 所说的,因为没有XamlSerializer......)

于 2009-10-23T14:27:46.637 回答
1

如果您使用的是 .Net 4.0(我相信它们不在 .Net 3.5 中)

您可以使用IAttachedPropertyStoreAttachablePropertyServices

参考示例 #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

于 2012-05-25T03:48:40.250 回答