2010-11-07 9 views
3

Quelqu'un peut-il me dire pourquoi cela fonctionne;WPF Datagrid ComboBox DataBinding

<DataGridTemplateColumn Header="Supplier"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ComboBox DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
        SelectedValue="{Binding SupplierID}" 
        ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 

mais ce n'est pas le cas;

<DataGridComboBoxColumn Header="Combo" DisplayMemberPath="SupplierName" SelectedValuePath="SupplierID" 
    SelectedValueBinding="{Binding SupplierID}" 
    ItemsSource="{Binding Path=DataContext.Suppliers, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 

Second extrait ne montre pas la liste des NomFournisseur sur ... modifier

Répondre

5

C'est parce qu'un DataGridComboBoxColumn n'est pas un élément d'interface utilisateur, mais ComboBox est.

Dans le premier exemple, parce que votre ComboBox fait partie de l'arbre visuel, RelativeSource peut faire ce qu'il est censé faire: marcher l'arbre de l'interface utilisateur à la recherche de l'élément que vous avez demandé. Mais dans le deuxième exemple, le DataGridComboBoxColumn est un DependencyObject mais ce n'est pas un élément d'interface utilisateur réel - c'est un objet qui décrit quelque chose à propos de l'élément de l'interface utilisateur.

Vous pouvez essayer d'utiliser ElementName à la place, et donner un nom à votre fenêtre racine. Ou bien, vous pourriez être en mesure de sortir avec juste:

<DataGridComboBoxColumn ... 
    ItemsSource="{Binding Path=Suppliers}" /> 

Le DataContext coulera de la fenêtre de la grille, donc à moins que vous avez overidden avec quelque chose d'autre à ce moment dans l'interface utilisateur, ce ll sera toujours disponible.

Si cela ne fonctionne pas, vous pouvez ajouter la collection appropriée à un dictionnaire de ressources afin de l'obtenir avec un Source={StaticResource suppliers} dans la liaison.

+0

trouvé que ElementName ne semble pas fonctionner pour la même raison, et Path = Suppliers ne fonctionne pas compte tenu du DataContext pour le DataGrid est déjà lié à la collection de lignes. Terminé aller avec les DataTemplates et en utilisant MultiBinding & un convertisseur pour montrer le nom en mode non-édition. Aucun-le-moins, vous répondez * pourquoi * cela ne fonctionne pas est correct :) –

0

La raison est que l'ItemsSource pour DataGridComboBoxColumn est introuvable.

Vous devrez utiliser la liaison RelativeSource et pointer vers le bon ancêtre DataContext. Cela prendra quelques essais et erreurs pour trouver le DataContext qui contient votre liste pour satisfaire votre ItemsSource.

+0

Le premier exemple dans la question indique où l'ItemsSource doit être récupéré. Comment accèderiez-vous à ceci via DataGridComboBoxColumn.ItemsSource? –