2010-11-11 8 views
2

J'ai de la difficulté à obtenir une réponse claire à cette question. J'ai une classe statique (DataHolder) qui contient une liste statique avec un type complexe (propriétés CustomerName et CustomerID). Je veux le lier à un ListBox dans WPF, mais ajouter un autre élément qui aura le mot "All" pour les capacités futures de glisser-déposer. Quelqu'un?Comment lier Listbox dans WPF à une liste générique?

Répondre

2

Créez une classe ViewModel dans laquelle vous pouvez créer des données! ViewModel peut référencer la classe statique et copier les éléments dans sa propre collection et y ajouter tous les éléments.

Vous aimez cette

public class YourViewModel 
{ 
     public virtual ObservableCollection<YourComplexType> YourCollection 
     { 
      get 
      { 
       var list = new ObservableCollection<YourComplexType>(YourStaticClass.YourList); 
       var allEntity = new YourComplexType(); 

       allEntity.Name = "all"; 
       allEntity.Id = 0; 

       list.Insert(0, allEntity); 

       return list; 
      } 

     } 
} 

Remarque, parfois, vous avez besoin d'articles vides. Étant donné que WPF ne peut pas numéroter vers des valeurs nulles, vous devez utiliser la même approche pour le gérer. L'entité commerciale vide a été une meilleure pratique pour cela. Juste le google.

+0

great.this vraiment résolu mon probelm. – user437631

0

Si vous utilisez une liaison que les données fournies que la source doit contenir tous les éléments, à savoir. vous ne pouvez pas créer de base de données, puis ajouter un autre élément à la liste.

Vous devez ajouter l'élément "Tous" à la collection DataHolder et gérer l'élément "Tous" séparément dans votre code.

1

Cet élément "Tous" doit faire partie de la liste à laquelle vous liez votre ListBox. Naturellement, vous ne pouvez pas ajouter cet élément à la liste DataHolder car il contient des éléments de type Client (ou similaire). Vous pouvez bien sûr ajouter un client "magique" qui agit toujours comme l'élément "Tous" mais c'est pour des raisons évidentes un cas sérieux d'odeur de design (c'est une liste de clients après tout).

Ce que vous pouvez faire, c'est de ne pas vous lier directement à la liste DataHolder mais d'introduire un wrapper. Ce wrapper serait votre ViewModel. Vous liez votre ListBox contre une liste de CustomerListItemViewModel qui représente un client ou l'élément "Tous".

CustomerViewModel 
{ 
    string Id { get; private set; } 
    string Name { get; set; } 
    public static readonly CustomerViewModel All { get; private set; } 

    static CustomerViewModel() 
    { 
     // set up the one and only "All" item 
     All = new CustomerViewModel(); 
     All.Name = ResourceStrings.All; 
    } 


    private CustomerViewModel() 
    { 
    } 

    public CustomerViewModel(Customer actualCustomer) 
    { 
     this.Name = actualCustomer.Name; 
     this.Id = actualCustomer.Id; 
    } 
} 

someOtherViewModel.Customers = new ObservableCollection<CustomerViewModel>(); 
// add all the wrapping CustomerViewModel instances to the collection 
someOtherViewModel.Customers.Add(CustomerViewModel.All); 

Et puis dans votre glisser & code déposer quelque part dans le ViewModel:

if(tragetCustomerViewModelItem = CustomerViewModel.All) 
{ 
    // something was dropped to the "All" item 
} 

je aurais pu juste que vous présenté aux avantages de MVVM dans WPF. Il vous évite beaucoup de tracas à long terme.