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).
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
Le combo est juste assis dans une grille et j'ai besoin de charger quelques valeurs dedans :-) – Vytas