我有一个问题。我有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设置的列表。
有什么想法吗?谢谢!
答案 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