2011-06-01 21 views
0

我有一個自定義Silverlight(4)控件,與數據網格不同。這個控件有一個名爲ColumnConfiguration的屬性。在導航應用程序中使用此控件時,ColumnConfiguration會再次(通過XAML)添加項目,同時保留舊列,結果是將正常數量的列的兩倍添加到控件中。在導航應用程序中添加兩次項目

public ColumnCollection ColumnConfiguration 
{ 
    get { return (ColumnCollection)GetValue(ColumnConfigurationProperty); } 
    set { SetValue(ColumnConfigurationProperty, value); } 
} 

public class ColumnCollection : Collection<ColumnBase> { } 

如何防止這些列再次添加到控件中?

XAML是這樣的:

<my:Control.ColumnConfiguration> 
<my:ColumnTypeA Width="*" MinWidth="50"> 
</my:ColumnTypeA> 
<my:ColumnTypeB Width="2*" MinWidth="50"> 

</my:ColumnTypeB> 
<my:ColumnTypeB Width="2*" MinWidth="50"> 

</my:ColumnTypeB> 
<my:ColumnTypeB Width="*" MinWidth="50"> 

</my:ColumnTypeB> 
<my:ColumnTypeB Width="2*" MinWidth="50"> 

</my:ColumnTypeB> 
</my:Control.ColumnConfiguration> 
+1

爲什麼要在XAML和c#中添加列? – ChrisF 2011-06-04 10:23:39

+0

他沒有或編輯過他的帖子... – eFloh 2011-06-04 17:12:11

+0

我不這樣做,他們通過XAML添加了兩次 – Bas 2011-06-04 21:29:15

回答

2

難道你提供的DependencyProperty UIPropertyMetaData的默認值?由於DependencyProperty是靜態的,因此在那裏指定的默認值將與您的控件的所有實例相同(引用)。這在使用值類型時是無害的,但是當您的屬性是引用類型時,您必須使用控件的.ctor()(或任何其他實例方式)設置其初始值,以便創建單獨的初始值。

我想你有這個控件兩次在你的應用程序中實例化,據推測使用MVVM DataTemplate?第一個實例會將列添加到使用默認值創建的靜態ColumnCollection中,並且secod也將再次使用該實例。

您可以通過查看ColumnCollection的默認ToString()值來驗證該值,它將包含引用的散列值。

要解決該問題,只需將ColumnConfigurationProperty的默認值設置爲null即可。

+1

並在構造函數中初始化collection屬性,並使屬性爲只讀。 – 2011-06-04 17:35:34

+0

謝謝!這讓我很頭疼 – Bas 2011-06-04 20:34:13

相關問題