2009-10-23 46 views
3

我正在编写使用复合应用程序库的.NET3.5 WPF应用程序。应用程序分为几个模块。如何序列化附加属性

在基础结构模块中,我定义了NetworkNode对象。 Network模块管理一系列NetworkNode,并使用XmlSerializer来存储/加载这个集合。到目前为止,万物都有效。

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

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

问候

回答

3

您可以列出使用DependencyObject.GetLocalValueEnumerator对象上定义的所有依赖属性(附与否):

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

然而,这将不利于对XML序列化(除非你实现IXmlSerializable的,这是一种痛苦。 ..)。你或许应该使用XamlWriter,而不是(我假设是什么德鲁说的是,因为没有XamlSerializer ...)

3

由于附加属性,不能从一个纯粹的CLR透视图中可见,XmlSerializer的没有办法了解他们。您需要切换到使用XamlSerializer体系结构,以便能够序列化“普通”CLR对象以及具有DependencyObjects的特殊知识。

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。 (您不能在“AttachableMemberIdentifier”中使用“Foo”作为名称,因为Xaml序列化程序堆栈需要通过反射来查找它们,因此将它们称为“SetBar”和“GetBar”)。这些方法应该利用AttachablePropertyServices来存储附加属性值。

参考例2:http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx