我创建了一个声明附加属性的类,该属性将包含一个datatemplates集合:
public class DynamicTemplatesList : DependencyObject
{
public static readonly DependencyProperty TemplatesProperty =
DependencyProperty.RegisterAttached("Templates", typeof(TemplateCollection), typeof(DynamicTemplatesList), new FrameworkPropertyMetadata(new TemplateCollection(),
FrameworkPropertyMetadataOptions.None));
public static void SetTemplates(UIElement element, TemplateCollection collection)
{
element.SetValue(TemplatesProperty, collection);
}
}
然后在xaml中我设置了集合:
<gfc:DynamicTemplatesList.Templates>
<gfc:Template Key="{StaticResource CheckBoxFieldType}"
DataTemplate="{StaticResource CheckBoxTemplate}" />
<gfc:Template Key="{StaticResource LookupEditFieldType}"
DataTemplate="{StaticResource LookupEditTemplate}" />
<gfc:Template Key="{StaticResource TextBoxFieldType}"
DataTemplate="{StaticResource TextBoxTemplate}" />
<gfc:Template Key="{StaticResource DateEditFieldType}"
DataTemplate="{StaticResource DateEditTemplate}" />
</gfc:DynamicTemplatesList.Templates>
这似乎第一次正常工作。但是我注意到的一件事是,当我用这个依赖属性关闭窗口然后再次重新打开它时, 似乎模板再次添加到集合中。
第一次,集合中将有4个模板,第2次8,依此类推。任何人都可以向我解释这里发生了什么?
我怀疑这是因为依赖属性的静态性质为什么值被重复,如果是这种情况,任何人都可以指出一个解决方案来防止附加的集合属性添加重复项?
答案 0 :(得分:0)
问题是您将new TemplateCollection()
设置为依赖项属性的默认值。这个&#34;静态&#34;无论何时使用属性而不事先分配属性,都将使用集合实例,就像在XAML中一样。
除了null
之外,您不应该使用包含可修改集合的依赖项属性的默认值。
public class DynamicTemplatesList
{
public static readonly DependencyProperty TemplatesProperty =
DependencyProperty.RegisterAttached(
"Templates",
typeof(TemplateCollection),
typeof(DynamicTemplatesList));
public static TemplateCollection GetTemplates(UIElement element)
{
return (TemplateCollection)element.GetValue(TemplatesProperty);
}
public static void SetTemplates(UIElement element, TemplateCollection collection)
{
element.SetValue(TemplatesProperty, collection);
}
}
现在在XAML中显式分配TemplateCollection
实例,如下所示:
<gfc:DynamicTemplatesList.Templates>
<gfc:TemplateCollection>
<gfc:Template ... />
<gfc:Template ... />
<gfc:Template ... />
<gfc:Template ... />
</gfc:TemplateCollection>
</gfc:DynamicTemplatesList.Templates>
请注意,如果只注册附加属性,则您的类不需要从DependencyObject
派生。