2008-11-22 7 views
8

Je me suis cogné la tête contre cela depuis un certain temps maintenant. Je ne suis pas vraiment sûr pourquoi ça ne marche pas. Je suis encore assez nouveau dans toute cette affaire WPF.WPF Binding Collection Pour ComboBox et la sélection d'un élément

Voici mon XAML pour le combobox

<ComboBox 
    SelectedValuePath="Type.FullName" 
    SelectedItem="{Binding Path=Type}" 
    Name="cmoBox" /> 

Voici ce que renseigne le ComboBox (est myAssembly une classe que j'ai créé une liste des types possibles)

cmoBox.ItemsSource = myAssembly.PossibleTypes; 

Je mis le DataContext dans un parent élément de la ComboBox dans le code derrière comme ceci:

groupBox.DataContext = listBox.SelectedItem; 

Je veux le bindin g pour sélectionner le "type possible" correct dans la liste déroulante. Il ne sélectionne rien. J'ai essayé SelectedValue et SelectedItem. Lorsque j'ai changé le DisplayMemberPath du ComboBox en une propriété différente, il a changé ce qui était affiché, donc je sais qu'il n'est pas complètement cassé.

Des idées ???

Répondre

11

Dans le code XAML, définissez ItemsSource="{Binding}" et (dans le code qui suit) définissez DataContext sur myAssembly.PossibleTypes.

+0

A travaillé super! Merci –

+0

:) Je ne l'ai pas testé ... mais je me suis récemment beaucoup intéressé à WPF (en raison de son utilisation au travail) ... Je me suis dit que c'était soit 100% correct, soit bien loin. –

12

Vous pouvez également définir la liaison dans le xaml plutôt que dans le code-behind (nous évitons le code derrière dans nos pages xaml chaque fois que possible). Je suppose que myAssembly est une propriété sur votre code-behind pour le contrôle et est une instance de votre classe MyAssembly ...

<UserControl 
    x:Class="MyNamespace.MyControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding}"> 

    <ComboBox 
    Width="200" 
    ItemsSource="{Binding Path=myAssembly.PossibleTypes}" 
    SelectedValuePath="Type.FullName" 
    SelectedItem="{Binding Path=Type}" 
    Name="cmoBox" /> 
</UserControl> 

Il peut être juste préférence personnelle, mais je pense qu'il est préférable d'avoir la pratique les liaisons de données dans le xaml car cela permet de voir plus facilement à quoi chaque contrôle est lié sans avoir à passer par le code-behind. En outre, si vous voulez faire référence à votre ComboBox à partir du code, vous devez lui assigner une propriété x: Name dans le xaml plutôt que juste Name.

-5

Je suis d'accord: les liaisons devraient être dans le XAML. Je mets ... en train de vérifier ... rien du tout dans le code derrière, jamais. Les sources de données sont toutes des "ressources" réutilisables.

(bien, OK, le constructeur de code-behind appelle InitializeComponent()).

+1

Vous n'avez pas répondu à cette question. Vous n'avez ajouté que votre préférence non pertinente pour ne pas utiliser le code derrière. De plus, la question avait déjà été correctement répondue 18 mois avant que votre 'réponse' ne soit postée. Pour ces raisons, -1. – Sheridan

+0

@Sheridan: +1 pour commenter pourquoi donner un point négatif. –