2009-10-23 78 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