2010-03-08 7 views
3

Dans notre application, nous avons un très grand ensemble de données qui agit comme notre dictionnaire de données pour les listes ComboBox, etc. Ces données sont statiquement mises en cache et saisies de 2 variables, donc j'ai pensé qu'il est sage d'écrire un contrôle dérivé de ComboBox et exposant les 2 clés en tant que DP. Lorsque ces 2 clés ont des valeurs correctes, je définis automatiquement la ItemsSource de la ComboBox à partir de la liste de dictionnaire de données à laquelle elle correspond. Je définis également automatiquement les SelectedValuePath et DisplayMemberPath dans le constructeur à Code et Description, respectivement.WPF dérivé ComboBox SelectedValuePath question

Voilà comment un exemple de la façon dont un élément dans la ItemsSource de la liste des dictionnaires de données a toujours l'air:

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

La valeur du code est toujours 4 caractères, mais parfois je ne ai besoin de lier 3 caractères il. Par conséquent, la propriété Code3.

Voilà comment le code ressemble à l'intérieur de mon combobox personnalisé pour définir la 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; 
} 

Maintenant, mon problème est, quand je change la SelectedValuePath dans le XAML à Code3, il ne fonctionne pas. Ce que je lie à SelectedValue obtient toujours le code complet de 4 caractères de DataDictionaryItem. J'ai même essayé de relancer SetItemsSource quand le SelectedValuePath a été changé et aucun dés.

Quelqu'un peut-il voir ce que je dois faire pour que mon combobox personnalisé se réveille et utilise le SelectedValuePath fourni s'il est remplacé dans le XAML? Le réglage de la valeur dans le setter de propriétés de mon objet métier lié SelectedValue n'est pas une option.

Voilà comment le XAML cherche mon combobox sous une forme:

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

EDIT: Je viens de rencontrer Snoop sur mon code et il dit que mon code est SelectedValuePath ... il ne semble pas jamais être réglé sur Code3 ... Zuh?

+1

Oui, c'est du code malodorant, mais c'est aussi un exemple de code afin d'éviter de coller toute mon application ici. – opedog

+0

(C'est 8 octets et 6, pas 4 octets et 3, au fait.) –

+1

Ok, clarifié Je voulais dire des caractères au lieu des octets. – opedog

Répondre

4

Ok, je l'ai compris.

Apparemment, la définition des valeurs par défaut d'un DependencyProperty dans le constructeur non statique par défaut d'un contrôle WPF est un non-non. Donc, au début, j'essayé ceci:

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

Mais ce gardais jeter une erreur en disant:

override des métadonnées et des métadonnées de base doit être du même type ou de type dérivé.

finalement compris que je voulais dire besoin d'utiliser FrameworkPropertyMetadata au lieu de PropertyMetadata:

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

Maintenant, le changement SelectedValuePath dans le XAML fonctionne très bien.