2010-03-08 65 views
3

在我們的應用中有一個非常大的數據集,充當我們的數據字典組合框列表等。這些數據staticly緩存和鍵控關閉2個變量的,所以我認爲明智的做法是寫一個從ComboBox派生出來的控件,並將這兩個鍵作爲DP進行公開。當這兩個鍵具有適當的值時,我會根據它所對應的數據字典列表自動設置ComboBox的ItemsSource。我還自動將構造函數中的SelectedValuePath和DisplayMemberPath分別設置爲Code和Description。WPF派生組合框SelectedValuePath問題

這裏是如何從數據字典表中的ItemsSource的項目怎麼看起來總是一個例子:

public class DataDictionaryItem 
{ 
    public string Code { get; set; } 
    public string Description { get; set; } 
    public string Code3 { get { return this.Code.Substring(0, 3); } } 
} 

碼的值始終是4個字符長,但有時我只需要綁定的3個字符它。因此,Code3屬性。

這裏的代碼看起來我的自定義組合框裏面設置的ItemsSource:

private static void SetItemsSource(CustomComboBox combo) 
{ 
    if (string.IsNullOrEmpty(combo.Key1) || string.IsNullOrEmpty(combo.Key2)) 
    { 
     combo.ItemsSource = null; 
     return; 
    } 

    List<DataDictionaryItem> list = GetDataDictionaryList(combo.Key1, combo.Key2); 
    combo.ItemsSource = list; 
} 

現在,我的問題是,當我改變SelectedValuePath在XAML來CODE3,這是行不通的。我綁定到SelectedValue的仍然從DataDictionaryItem獲取完整的4個字符的代碼。我甚至嘗試在SelectedValuePath被更改並且沒有骰子時重新運行SetItemsSource。

有人能看到什麼,我需要做的就是我的自定義組合框喚醒和使用,如果它在XAML覆蓋真實提供的SelectedValuePath?在我的SelectedValue綁定業務對象中調整屬性設置器中的值不是一個選項。

這裏的XAML如何查找我的表單中組合框:

<c:CustomComboBox Key1="0" Key2="8099" SelectedValuePath="Code3" SelectedValue="{Binding Thing}"/> 

編輯:我只是跑在我的代碼窺探和它說我SelectedValuePath是代碼...它不會出現曾經被設置爲Code3 ... Zuh?

+1

是的,這是很臭的代碼,但它也是示例代碼,以避免粘貼我的整個應用程序。 – opedog 2010-03-08 23:41:05

+0

(這是8字節和6,而不是4字節和3,順便說一下)。 – 2010-03-09 15:29:30

+1

好的,澄清我的意思是字符而不是字節。 – opedog 2010-03-09 21:57:57

回答

4

好的,我想通了。

顯然設置在WPF控件的默認非靜態構造函數DependencyProperty的默認值是一個沒有沒有。因此,在第一次我嘗試這樣做:

static ValueCodeListComboBox() 
{ 
    SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Code")); 
    DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Description")); 
} 

但這保持拋出一個錯誤說:

元數據覆蓋和基本元數據必須是同一類型或派生類型。

終於想通了,這意味着我需要使用FrameworkPropertyMetadata代替PropertyMetadata的:

static ValueCodeListComboBox() 
{ 
    SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Code")); 
    DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Description")); 
} 

在XAML現在改變SelectedValuePath的偉大工程。