2010-11-09 16 views
2

J'ai une zone de liste dont le ItemsSource est défini sur Dictionary(Of String, ColumnMetadata). ColumnMetadata est une structure. Je peux facilement obtenir le DisplayMemberPath pour montrer les clés en le réglant sur "Key", mais je n'arrive pas à comprendre comment le montrer à un membre de ma structure.Définition de DisplayMemberPath à la valeur de structure d'un dictionnaire Membre

J'ai essayé paramètres DisplayMemberPath à "{Binding LocalizedColumn}", "Value.LocalizedColumn", "LocalizedColumn", "{Value.LocalizedColumn}" et aucun de ces œuvres. Je reçois juste un tas de lignes vides dans ma liste.

Tout ce que je cherche à accomplir est d'obtenir les données dans la liste. Je ne suis pas concerné par les mises à jour du dictionnaire et le dictionnaire ne sera pas mis à jour après que la liste soit remplie.

Le code que je suis maintenant est activé lors de l'exécution:

 
     lstDatabaseColumns.ItemsSource = ImportData.GetAddressFieldData 
     lstDatabaseColumns.DisplayMemberPath = "Value.LocalizedColumn" 
     lstDatabaseColumns.SelectedValuePath = "Key" 

Ma structure ressemble:

 
    Public Structure ColumnMetadata 
     Dim LocalizedColumn As String 
     Dim Description As String 
    End Structure 

Je reçois le message suivant dans ma fenêtre de sortie:

 
System.Windows.Data Error: 40 : BindingExpression path error: 'LocalizedColumn' property not found on 'object' ''ColumnMetadata' (HashCode=1118531966)'. BindingExpression:Path=Value.LocalizedColumn; DataItem='KeyValuePair`2' (HashCode=-1578744570); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') 

+2

le correct 'DisplayMemberPath' est" Value.LocalizedColumn ". Si cela ne fonctionne pas, vérifiez la fenêtre de sortie dans VS pour les erreurs de liaison –

Répondre

0

j'ai changé mon code pour une classe et la fonction ToString() l'emporterait sur:

 
    Public Class ColumnMetadata 
     Public LocalizedColumn As String 
     Public Description As String

Public Overrides Function ToString() As String 
     Return LocalizedColumn 
    End Function 
End Class 

Je mis mes tâches d'exécution à:

 
     lstDatabaseColumns.ItemsSource = ImportData.GetAddressFieldData 
     lstDatabaseColumns.DisplayMemberPath = "Value" 
     lstDatabaseColumns.SelectedValuePath = "Key" 

Maintenant, tout fonctionne. Lorsqu'un utilisateur clique sur un élément dans la zone de liste et ils veulent faire quelque chose avec les autres éléments de la classe, par exemple assigner à une zone de texte, j'ai mis ce code:

 
lblColumnDescription.Text = DirectCast(lstDatabaseColumns.SelectedItem, KeyValuePair(Of String, ImportData.ColumnMetadata)).Value.Description 

En utilisant cette méthode Je peux maintenant accéder à n'importe quelle partie de la classe ou à la clé du dictionnaire.

Je suis toujours intéressé à savoir quoi mettre DisplayMemberPath afin de montrer un membre spécifique d'une structure.

1

I testé DisplayMemberPath="Value.MyValue" et cela a bien fonctionné.

Les données de l'échantillon était:

public class MyClass 
{ 
    public string MyValue { get; set; } 
} 

public Dictionary<int, MyClass> Data 
{ 
    get 
    { 
     Dictionary<int, MyClass> data = new Dictionary<int, MyClass>(); 
     data[0] = new MyClass { MyValue = "A" }; 
     data[1] = new MyClass { MyValue = "B" }; 

     return data; 
    } 
} 

Xaml:

<ListBox DisplayMemberPath="Value.MyValue" x:Name="lst" ItemsSource="{Binding ElementName=local, Path=Data}" /> 

Bonne chance!

+0

Je viens de convertir ma structure en classe et cela ne fonctionne toujours pas. Est-ce important que je fasse toutes mes liaisons à l'exécution? (J'ai mis à jour ma question pour inclure mon code.) – cjbarth

+0

L'OP utilisait une struct, pas une classe ... C'est peut-être pourquoi ça ne marche pas pour lui, même si je doute que ça change quelque chose. Avez-vous essayé avec une structure aussi? –