2009-11-11 13 views
1

Salut une question rapide vraiment dans WPF.WPF liaison à la zone de liste déroulante

Est-ce que quelqu'un sait comment je peux lier une zone de liste déroulante qui va s'asseoir dans une grille à un ensemble de données que j'ai.

L'ensemble de données contient plusieurs colonnes et plusieurs rangées, mais je veux prendre l'une des colonnes, disons ProcessID et juste l'afficher dans la boîte de dialogue.

Est-ce que quelqu'un a déjà fait cela ou sait comment cela peut être fait dans WPF.

Merci Iffy.

+0

Après la lecture votre message à nouveau, voulez-vous dire que l'ensemble de données sera lié à un DataGrid, et le combo occupera chaque cellule dans une colonne de ce DataGrid? Ou voulez-vous dire que le combo est juste assis dans une grille? (Il y a une grande différence entre les deux). Ma réponse ci-dessous est pour quand le combo fait partie du flux normal pour la page, c'est-à-dire qu'il est dans une grille. – slugster

+0

Le combo est juste assis dans une grille et j'ai besoin de charger quelques valeurs dedans :-) – Vytas

Répondre

0

Vous devez utiliser LINQ to SQL, ADO.Net ou cadre d'entité pour extraire des données de base de données, vous ne pouvez pas lier combobox avec table de base de données, mais les données Whit dans la mémoire

1

Pour ce faire un programme, voici une fonction générique que j'ai pour cela:

/// <summary> 
    /// Thread safe method for databinding the specified ComboBox with the specified data. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="ctrl">The Combo to be databound.</param> 
    /// <param name="datasource">The data to be bound to the Combo.</param> 
    /// <param name="displayPath">The name of the property in the data objects that should be used for the display value.</param> 
    /// <param name="valuePath">The name of the property in the data objects that should be used for the value.</param> 
    /// <remarks> 
    /// This function was written as generic so that it doesn't matter what types the IEnumerabe datasource is, it can handle them all. 
    /// </remarks> 
    private void UpdateComboDataSource<T>(ComboBox ctrl, IEnumerable<T> datasource, string displayPath, string valuePath) 
    { 
     if (ctrl == null) 
      throw new ArgumentNullException("Control to be bound must not be null"); 

     //check if we are on the control's UI thread: 
     if (ctrl.Dispatcher.CheckAccess()) 
     { 
      //we have full access to the control, no threading issues, so let's rip it up and databind it 
      datasource = datasource.OrderBy(x => x); 
      if (displayPath != null && ctrl.DisplayMemberPath == null) 
       ctrl.DisplayMemberPath = displayPath; 
      if (valuePath != null && ctrl.SelectedValuePath == null) 
       ctrl.SelectedValuePath = valuePath; 

      ctrl.ItemsSource = datasource; 

      //be nice to the user, if there is only one item then automatically select it 
      ctrl.SelectedIndex = datasource.Count() == 1 ? 0 : -1; 
     } 
     else 
     { 
      //we don't have full access to the control because we are running on a different thread, so 
      //we need to marshal a call to this function from the control's UI thread 
      UpdateComboDataSourceDelegate<T> del = new UpdateComboDataSourceDelegate<T>(this.UpdateComboDataSource); 
      ctrl.Dispatcher.BeginInvoke(del, ctrl, datasource, displayPath, valuePath); 
     } 
    } 

    private delegate void UpdateComboDataSourceDelegate<T>(ComboBox ctrl, IEnumerable<T> dataSource, string displayPath, string valuePath); 

Les commentaires vous disent tout ce que vous devez savoir. Il peut également être fait par programmation en créant un Binding entre la propriété ItemSource du contrôle et une propriété publique sur votre page - c'est la même manière que cela est fait de manière déclarative (il doit y avoir un milliard d'exemples de cela, donc j'ai gagné ' t le montrer ici).

+0

Merci pour votre aide. J'apprécie vraiment cela. :) – Iffy

2

En supposant qu'il est un DataSet capital D que vous pouvez exposer à XAML comme une propriété sur un objet DataContext (montrant la « Description » colonne pour chaque ligne de la table « LookupTable »):

<ComboBox ItemsSource="{Binding Path=MyDataSetExposedAsAProperty.Tables[LookupTable].Rows}" 
DisplayMemberPath=".[Description]"/> 
Questions connexes