2010-11-26 8 views
1

J'essaie de lier un contrôle ComboBox à une liste de chaînes extraites d'une liste d'objets personnalisés.Comment obtenir une liste dynamique de valeurs de propriétés distinctes d'une liste?

Voici l'objet que je utilise:

public class Operation 
{ 
    public DateTime ValueDate { get; set; } 
    public int Amount { get; set; } 
    public string Category { get; set; } 
} 

Ce que je suis en train de faire est de lier la zone de liste déroulante utilisée pour entrer la catégorie une nouvelle opération à la liste des catégories distinctes déjà existantes dans une liste des opérations.

Exemple:

Liste des opérations:

{04/12/2010, 100, "Home"} 
{05/12/2010, 100, "Home"} 
{05/12/2010, 200, "Entertainment"} 

Disponible dans la liste complète-automatique du combobox: "Home", "Entertainment".

Actuellement, je suis en mesure d'obtenir une liste statique des catégories disponibles dans la liste, mais je ne parviens pas à mettre la liste à jour lorsque j'ajoute une nouvelle opération à la liste existante.

+0

Avez-vous résolu le problème? –

+0

Ouais, j'ai terminé unbind et reliant comme vous l'avez suggéré. –

+0

Travailler avec un 'BindingSource' pourrait également proposer d'autres fonctionnalités intéressantes. Je suggère, si cela vous intéresse, que vous jetiez un œil sur cette classe pour référence future afin que vous puissiez faire fonctionner cet objet pour vous non plus. Content de pouvoir aider de toute façon! =) –

Répondre

1

Vous aurez besoin de dissocier et de relier votre liste pour la régénération.

+0

C'est exactement ce que je voudrais éviter, est-ce qu'il n'y a vraiment aucun autre moyen de gérer cela? –

+0

Vous devez ensuite utiliser une 'BindingSource' dont vous allez définir la propriété 'DataSource', puis affecter cette' BindingSource' à votre 'ComboBox.DataSource'. Une fois que vous avez terminé, essayez de travailler directement avec le 'CurrencyManager'. Pour l'actualisation, vous devrez ensuite utiliser l'une des méthodes 'Refresh' parmi les objets mentionnés ci-dessus. –

0

Vous pouvez le faire:

_combo.ItemsSource = _operationsCollection; 
_combo.DisplayMemberPath = "Category"; 
_combo.Items.Filter = Filter; 

private bool Filter(object operationObj) 
{ 
    var operation = (Operation)operationObj; 
    var first = _operationsCollection.First(p => p.Category == operation.Category); 
    return ReferenceEquals(operation, first); 
}