wpf 如何序列化附加属性

64jmpszr  于 2023-06-24  发布在  其他
关注(0)|答案(3)|浏览(79)

我正在使用复合应用程序库编写.NET3.5,WPF应用程序。应用程序分为几个模块。
在基础设施模块中,我定义了NetworkNode对象。Network模块管理NetworkNodes的集合,并使用XmlSerializer存储/加载此集合。到目前为止,一切正常。
但我有其他模块,例如NodeModule。如果在Network模块中选择了NetworkNode,则使用EventAggregator将事件发布到其他模块。这些模块可以使用附加属性将各种信息附加到NetworkNode。
问题是NetworkModule不知道其他模块,因此这些属性没有序列化。有可能以某种方式列出并序列化附加到一个对象的所有属性?或者我必须改变概念并使用附加属性以外的其他东西吗?
问候

1cklez4t

1cklez4t1#

您可以使用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…)

ghg1uchk

ghg1uchk2#

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

tvz2xvvm

tvz2xvvm3#

如果你使用的是.Net 4.0(我相信他们不在.Net 3.5中)
可以使用IAttachedPropertyStoreAttachablePropertyServices
参考实施例#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:

相关问题