我正在使用复合应用程序库编写.NET3.5,WPF应用程序。应用程序分为几个模块。
在基础设施模块中,我定义了NetworkNode对象。Network模块管理NetworkNodes的集合,并使用XmlSerializer存储/加载此集合。到目前为止,一切正常。
但我有其他模块,例如NodeModule。如果在Network模块中选择了NetworkNode,则使用EventAggregator将事件发布到其他模块。这些模块可以使用附加属性将各种信息附加到NetworkNode。
问题是NetworkModule不知道其他模块,因此这些属性没有序列化。有可能以某种方式列出并序列化附加到一个对象的所有属性?或者我必须改变概念并使用附加属性以外的其他东西吗?
问候
3条答案
按热度按时间1cklez4t1#
您可以使用
DependencyObject.GetLocalValueEnumerator
列出对象上定义的所有依赖项属性(附加或未附加):但是,这对XML序列化没有帮助(除非实现IXmlSerializable,这是一个痛苦的问题)。您可能应该使用
XamlWriter
来代替(我假设这就是Drew所说的,因为没有XamlSerializer
…)ghg1uchk2#
由于附加属性从纯CLR透视图中不可见,XmlSerializer无法知道它们。您需要切换到使用XamlSerializer体系结构,以便能够序列化“普通”CLR对象以及具有DependencyObjects的特殊知识。
tvz2xvvm3#
如果你使用的是.Net 4.0(我相信他们不在.Net 3.5中)
可以使用IAttachedPropertyStore或AttachablePropertyServices
参考实施例#1:XAML in .Net 4.0: Attached Properties, IAttachedPropertyStore and AttachablePropertyServices
此外,通常必须正确定义附加属性:
1.它必须是公共(或某些场景中的内部工程)非嵌套类型的属性(即它没有在另一个类型中声明),T。
1.定义新的AttachableMemberIdentifier(T,“MyProperty”)
1.在T上提供名为“SetMyProperty”和“GetMyProperty”的公共静态方法,即“MyProperty”部分必须与您的AttachableMemberIdentifier匹配。(不能在AttachableMemberIdentifier中使用“Foo”作为名称,并将它们称为“SetBar”和“GetBar”,因为Xaml序列化器堆栈需要通过反射找到它们。)然后,这些方法应该利用AttachablePropertyServices来存储附加的属性值。
参考实施例#2: