3

Composite Application Libraryを使用して.NET3.5、WPFアプリケーションを書いています。アプリケーションはいくつかのモジュールに分かれています。

インフラストラクチャ モジュールで NetworkNode オブジェクトを定義しました。Network モジュールは NetworkNodes のコレクションを管理し、XmlSerializer を使用してこのコレクションを保存/ロードします。これまでのところ、すべてが機能します。

しかし、NodeModuleなどの他のモジュールがあります。Network モジュールで NetworkNode が選択された場合、イベントは EventAggregator を使用して他のモジュールに発行されます。これらのモジュールは、添付プロパティを使用してさまざまな情報を NetworkNode に添付できます。

問題は、NetworkModule が他のモジュールを認識しないため、これらのプロパティがシリアル化されないことです。オブジェクトにアタッチされたすべてのプロパティを何らかの方法でリストしてシリアル化することは可能ですか? または、概念を変更して、添付プロパティ以外のものを使用する必要がありますか?

よろしく

4

3 に答える 3

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ます...)

于 2009-10-23T14:27:46.637 に答える
3

添付プロパティは純粋な CLR の観点からは見えないため、XmlSerializer はそれらについて知る方法がありません。「プレーンな」CLR オブジェクトの両方をシリアル化し、DependencyObjects の特別な知識を得るには、XamlSerializer アーキテクチャを使用するように切り替える必要があります。

于 2009-10-23T13:51:44.140 に答える
1

.Net 4.0 を使用している場合 (.Net 3.5 にはないと思います)

IAttachedPropertyStoreまたはAttachablePropertyServicesのいずれかを使用できます

参照例 #1: http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

また、一般に、添付プロパティを正しく定義する必要があります。

  1. これは、ネストされていない型 (つまり、別の型内で宣言されていない) のパブリック (または一部のシナリオでは内部動作) のプロパティである必要があります。
  2. 新しい AttachableMemberIdentifier(T, "MyProperty") を定義します
  3. 「SetMyProperty」および「GetMyProperty」と呼ばれる T の public static メソッドを提供します。つまり、「MyProperty」の部分は、AttachableMemberIdentifier と一致する必要があります。(Xaml シリアライザー スタックはリフレクションによってそれらを見つける必要があるため、AttachableMemberIdentifier の名前として "Foo" を使用して "SetBar" および "GetBar" と呼ぶことはできません)。これらのメソッドは、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 に答える