0

一部のタイプのリストを依存関係プロパティに設定できるようにする必要がある動作を作成しています。明確にするために、ここに例があります:

<SomeUserControl .....>
  <i:Interaction.Behaviors>
    <local:CustomBehavior PropertyA="False">
      <local:CustomBehavior.PropertyBList>
        <x:Type Type="local:TypeA" />
        <x:Type Type="local:TypeB" />
        <x:Type Type="local:TypeC" />
      </local:CustomBehavior.PropertyBList>
    </local:CustomBehavior>
  </i:Interaction.Behaviors>
</SomeUserControl>

ご覧のとおり、動作はXAMLで渡される型のリストを受け入れる必要があります。タイプのコレクションをに渡すことがわかった唯一の方法は、 :DependencyPropertyを使用することです。DependencyPropertyKey

private static readonly DependencyPropertyKey PropertyBListPropertyKey =
    DependencyProperty.RegisterReadOnly("PropertyBList", typeof(List<Type>), typeof(CustomBehavior), new PropertyMetadata(new List<Type>()));

public static readonly DependencyProperty PropertyBListProperty = PropertyBListPropertyKey.DependencyProperty;

public List<Type> PropertyBList
{
    get { return (List<Type>)GetValue(PropertyBListProperty); }
}

ただし、このアプローチの問題は、コレクションがリセットされないことです。たとえば、UserControlsを使用する2つがある場合CustomBehaviorPropertyBListコレクションには両方のユーザーコントロールに追加されたタイプが含まれますPropertyBList。つまり、この動作を使用するすべてのユーザーコントロール間で共有される静的コレクションのように機能します。

この問題を解決する方法は?その依存関係プロパティをList<Type>共有ではなく、ユーザーコントロールインスタンス固有にする方法は?

4

1 に答える 1

1

問題はPropertyBList、CustomBehaviorのすべてのインスタンスで共有されるプロパティメタデータのデフォルト値で値を初期化することです。代わりに、CustomBehaviorコンストラクターで値を初期化できます。

private static readonly DependencyPropertyKey PropertyBListPropertyKey =
    DependencyProperty.RegisterReadOnly(
        "PropertyBList", typeof(List<Type>), typeof(CustomBehavior), null);

public static readonly DependencyProperty PropertyBListProperty =
    PropertyBListPropertyKey.DependencyProperty;

public List<Type> PropertyBList
{
    get { return (List<Type>)GetValue(PropertyBListProperty); }
}

public CustomBehavior()
{
    SetValue(PropertyBListPropertyKey, new List<Type>());
}
于 2013-01-06T22:13:47.333 に答える