2012-06-27 73 views
2

我有一個自定義的WPF控件基類。此基類註冊一個定製屬性,其類型爲「List <」,某些類型爲「>」。如何初始化自定義WPF控件中的集合屬性

如何初始化設計時間的屬性?列表中應始終有8個對象,用戶應能夠修改此對象。

我試圖給PropertyMetadata對象傳遞一個默認值,但在屬性編輯器中顯示的集合總是空的。

public class CustomPropertyTestBase : UserControl 
{ 

    static CustomPropertyTestBase() 
    { 
     List<object> defaultValue = new List<object>(new object[8]); 
     MyCustomObjectsProperty = DependencyProperty.Register("MyCustomObjects", 
      typeof(List<object>), typeof(CustomPropertyTestBase), 
      new PropertyMetadata(defaultValue)); 
    } 

    public static DependencyProperty MyCustomObjectsProperty; 

    [Category("MyCustomProperties")] 
    public List<object> MyCustomObjects 
    { 
     get; 
     set; 
    } 
} 

編輯:

每當我在屬性編輯器中添加一個新的對象,這些新的對象沒有存儲。重新打開屬性編輯器後,列表再次爲空。

我已將調試器附加到設計器,編輯器從不會調用該屬性的get或set方法。

SOLUTION:

正如「dowhilefor」提到的那樣。我不得不改變類型ObservableCollection。現在設計師正確地存儲更改的列表。 謝謝。

+0

對於您的用戶控件(即單身人士)的實例,列表是否應該相同?如果沒有,則使用'new PropertyMeta(null)'而不是'new PropertyMetadata(defaultValue)'並在公共構造函數中使用'MyCustomObjects = new List (...)'。 – 2012-06-27 10:55:38

回答

1

像這樣的東西應該工作:

public MainWindow() 
    { 
     InitializeComponent(); 

     if(System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
     { 
      MyCustomObjects = new List<object>(); 
      MyCustomObjects.Add("Hello"); 
     } 
    } 

但也許它不是最好的解決方案。我記得有一些表達式混合工具有虛擬數據,但不記得他們是如何做到的。當然這是靜態的,你不能改變它,但我不認爲這是可能的。

+0

我已經試過這個,並將調試器附加到設計器上。構造函數被調用並且List被正確填充,但屬性編輯器顯示一個空列表。屬性get或set方法從不被編輯調用。 –

+1

這是正確的,WPF不使用這些getter和setter。你剛剛寫下了;組;我希望這只是爲了簡化,而不是你的實際代碼,因爲那是錯誤的。另外,您可能想要檢查ObservableCollection是否適合您的需求,如果您需要添加或從列表中刪除,則需要主動更新。 – dowhilefor

1

當您需要顯示設計時間的樣本數據時,您不應該將樣本數據硬編碼到C#代碼中。

而是使用屬性d:DesignData和支持的示例數據* .xaml文件在設計器中顯示示例數據。文章Design-time Attributes顯示瞭如何做到這一點。

這是另一篇關於DesignData的好文章:DesignData MVVM support in Blend, VS2010 and ...

請注意DesignData不僅適用於Blend,還適用於Visual Studio。

1

正如「dowhilefor」所述。我不得不改變類型ObservableCollection。現在設計師正確地存儲更改的列表。謝謝。