附加依赖类型(List <t>)问题</t>

时间:2011-01-09 22:08:30

标签: silverlight dependency-properties

我有一个问题。我有dep。支柱。类型列表..

    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>

确定。现在的问题是,当我尝试获取某个元素的规则列表时。如果有txt1和txt2的实例,当我得到验证规则时,它们都返回SomeValidationRule的实例。

Grid.GetValidationRules(txt1Instance);

Grid.GetValidationRules(txt2Instance);

返回相同的列表。

即使尝试

Grid.GetValidationRules(new TextBox());

我使用SomeValidationRule获得与列表中的alement相同的列表。所以这很奇怪。如果我手动将列表设置为某个元素,那么该元素具有我设置的列表,但是所有其他元素都具有我在xaml中为txt1设置的列表。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

尝试此修改: -

    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);

此代码删除在元数据中创建的List的单个实例,并推迟创建列表,直到第一次调用GetValidationRules,如果尚未创建列表,则会创建一个列表创建

使用PropertyMetaData时,只应使用不可变类型作为默认值。

答案 1 :(得分:0)

您可以在构造函数中设置默认值(并且在定义DependencyProperty时不提供一个,因为在这种情况下使用集合实际上设置了单个默认值)。

如果经常使用该属性,你可以避免在get访问器中进行额外的比较(我想如果很少使用该属性,那么在第一次调用默认值时会按照其他答案中的建议调用它)。

实际上这是微软建议的模式: http://msdn.microsoft.com/en-us/library/cc903961(VS.95).aspx