2010-03-08 93 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的伟大工程。