2015-02-24 42 views
0

我正在嘗試創建動態可展開工具箱,如下圖所示。 enter image description here創建動態可展開工具箱

自定義控件將根據可用空間將不同的項目放在基礎菜單和高級菜單中。如果有足夠的空間顯示基本菜單中的所有項目,則不會顯示高級菜單。 我已經創建了這個控件,只要我在應用程序中只使用它一次,它就可以工作。如果我多次instanciate,我會得到下面的異常,我很難理解,因爲我只是將一個元素添加到非靜態列表中。

Exception 有沒有人有另一種想法如何創建此控制不同以避免此問題,或知道是什麼創建此異常?

鏈接到該解決方案:ButtonsItemsControl(若要重現該問題只是取消註釋行MainWindow.xaml

的15任何幫助表示讚賞

回答

0

你的問題就出在你的ButtonsItemsControl類的依賴屬性的聲明:

public ObservableCollection<FrameworkElement> BasedMenuItems 
{ 
    get { return (ObservableCollection<FrameworkElement>)GetValue(BasedMenuItemsProperty); } 
    set { SetValue(BasedMenuItemsProperty, value); } 
} 
public static readonly DependencyProperty BasedMenuItemsProperty = 
     DependencyProperty.Register("BasedMenuItems", typeof(ObservableCollection<FrameworkElement>), typeof(ButtonsItemsControl), 
     new PropertyMetadata(new ObservableCollection<FrameworkElement>())); 

設置默認值是依賴屬性,這是ObservableCollection<FrameworkElement>一個實例。但問題是,在創建這種情況下,當這條線是EXECUT編輯,這是當你的類被加載到內存中並且靜態字段被初始化時。因此,這意味着如果這些屬性未被覆蓋,每個ButtonsItemsControl實例將共享相同的集合對象。

您應該刪除在PropertyMetadata構造函數的默認值,而不是設置,當你控制實例化,在自己構造一個新值:

public ButtonsItemsControl() 
{ 
    BasedMenuItems = new ObservableCollection<FrameworkElement>(); 
    ... 
} 

這似乎違反直覺的,但據我所知,沒有更好的方法(實際上框架使用內部的工廠對象創建新的類實例來產生唯一的默認值,但是無論出於何種原因,他們沒有在框架之外公開這些工廠)。

+0

非常感謝,我真的沒有想法,我也學到了一些東西。 – Loris 2015-02-24 14:33:32