WPF集合依赖项属性添加重复项

时间:2017-07-03 17:49:13

标签: c# wpf xaml dependency-properties

我创建了一个声明附加属性的类,该属性将包含一个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,依此类推。任何人都可以向我解释这里发生了什么?

我怀疑这是因为依赖属性的静态性质为什么值被重复,如果是这种情况,任何人都可以指出一个解决方案来防止附加的集合属性添加重复项?

1 个答案:

答案 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派生。