2017-07-03 46 views
1

我已經創建了一個聲明瞭一個附加屬性,這將持有的DataTemplates的集合類:WPF集合依賴項屬性添加重複

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個模板,第二次8,等等等等。任何人都可以向我解釋這裏發生了什麼?

我懷疑這是因爲依賴屬性的靜態特性,爲什麼被複制的值,如果是這樣的話任何人都可以點我的解決方案,以防止被安裝集合屬性從添加重複?

回答

0

的問題是,你設置new TemplateCollection()爲依賴項屬性的默認值。這個「靜態」集合實例將在您使用您的屬性而不用分配之前使用,就像您在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派生如果只註冊附加屬性。

+0

看來,如果我將新的FrameworkPropertyMetadata(新TemplateCollection(), FrameworkPropertyMetadataOptions.None)的依賴項屬性的默認值更改爲null,當我加載相關的xaml控件時,它將引發一個空異常,指出Templates屬性爲null 。 –

+0

另一件事是,我不需要派生從DependencyObject有權訪問SetCurrentValue方法? –

+0

是的,我確實改變了構造函數 –