2011-01-09 3 views
1

問題が1つあります。私は退院している。小道具List型の..添付された依存関係のタイプ(リスト<T>)問題

public const string ValidationRulesPropertyName = "ValidationRules"; 


    public static List<ValidationRule> GetValidationRules(DependencyObject obj) 
    { 
     return (List<ValidationRule>)obj.GetValue(ValidationRulesProperty); 
    } 


    public static void SetValidationRules(DependencyObject obj, List<ValidationRule> value) 
    { 
     obj.SetValue(ValidationRulesProperty, value); 
    } 

    public static readonly DependencyProperty ValidationRulesProperty = DependencyProperty.RegisterAttached(
    ValidationRulesPropertyName, 
    typeof(List<ValidationRule>), 
    typeof(CustomGrid), 
    new PropertyMetadata(new List<ValidationRule>())); 

そして今、私は私のカスタムグリッド内のいくつかのテキストボックスを設定し、ValidationRules

<Grid> 
<TextBox x:Name="txt1"> 
<ValidationRules> 
<Validation:SomeValidationRule/> 
</ValidationRule> 
</TextBox> 
<TextBox x:Name="txt2"/> 
</Grid> 

オクラホマの1つのリスト内の場合。ここで問題は、いくつかの要素のルールのリストを取得しようとするときです。txt1とtxt2のインスタンスがある場合、検証ルールを取得すると、両方ともSomeValidationRuleのインスタンスが返されます。

Grid.GetValidationRules(txt1Instance); 

Grid.GetValidationRules(txt2Instance); 

リターン同じリスト。

Grid.GetValidationRules(new TextBox()); 

を試す場合でも、私は、リスト内の唯一のalementようSomeValidationRuleと同じリストを取得します。だからそれは奇妙です。私は手動でいくつかの要素にリストを設定する場合、その要素は、私が設定したリストを持っている他のすべての要素は、私はtxt1のxamlで設定したリストを持っています。

ありがとう!

+0

あなたは)(Grid.GetValidationRulesのコードを投稿することができますか? –

+0

'PropertyMetadata(new List )'は一度だけ実行されるため、すべてのルールが追加される「新しいリスト」が1つだけ作成されるからです。私には答えはありませんが、それが現在の行動が起こっている理由です。 –

答えて

1

この変更してみてください - このコードは、メタデータで作成しListの単一のインスタンスを削除し、1つが初めてGetValidationRulesが順番にリストを作成する呼び出されるまで、リストの作成を延期

public const string ValidationRulesPropertyName = "ValidationRules"; 

    public static List<ValidationRule> GetValidationRules(DependencyObject obj) 
    { 
     object result = obj.ReadLocalValue(ValidationRulesProperty); 
     if (result == DependencyProperty.UnsetValue) 
     { 
      result = new List<ValidationRule>(); 
      obj.SetValue(ValidationRulesProperty, result); 
     } 
     return (List<ValidationRule>)result; 
    } 


    public static void SetValidationRules(DependencyObject obj, List<ValidationRule> value) 
    { 
     obj.SetValue(ValidationRulesProperty, value); 
    } 

    public static readonly DependencyProperty ValidationRulesProperty = DependencyProperty.RegisterAttached(
    ValidationRulesPropertyName, 
    typeof(List<ValidationRule>), 
    typeof(CustomGrid), null); 

をまだ作成されていません。

PropertyMetaDataを使用する場合は、不変型のみをデフォルト値として使用する必要があります。

+0

アンソニーありがとう! –

0

コンストラクタでデフォルト値を設定できます(この場合、コレクションでは実質的にシングルトンのデフォルト値が設定されるため、DependencyPropertyの定義時に値を指定しないでください)。

プロパティを頻繁に使用すると、getアクセサで余分な比較を避けることができます(このプロパティを使用することはめったにありませんが、他の回答で提案されているように、

実はこれは、マイクロソフトが提案するパターンです: http://msdn.microsoft.com/en-us/library/cc903961(VS.95).aspx

関連する問題