2010-01-28 3 views
16

J'ai une zone de liste déroulante dans une application WPF qui est liée à un objet ObservableCollection of Department dans une classe C# ViewModel. Je veux utiliser la zone de liste déroulante pour filtrer une autre collection par département (Et en effet cela fonctionne pour cela maintenant) Le problème est que je veux ajouter une option supplémentaire "Tous" en haut de la liste. Y a-t-il un moyen correct de le faire? Faire un faux département se sent mal à bien des égards.Comment ajouter un élément générique à une zone de liste déroulante liée à une collection dans WPF

Le ComboBox

<ComboBox ItemsSource="{Binding Path=Departments}" 
      SelectedValue="{Binding Path=DepartmentToShow , Mode=TwoWay}" /> 

Répondre

22

Vous pouvez utiliser un CompositeCollection comme ItemsSource pour la zone de liste déroulante pour inclure l'option "All". Vous devez définir la propriété Collection du CollectionContainer sur votre "ObservableCollection of Department objects".

<ComboBox > 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <ComboBoxItem>All</ComboBoxItem> 
      <CollectionContainer x:Name="departmentCollection"/> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

Je ne sais pas si ce sera adapté à votre situation de filtrage mais ...

+1

+1 Wow en tant que programmeur WPF expérimenté, je n'étais même pas au courant de 'CompositeCollection'! Il existe toutes sortes de solutions de contournement pour cela lors de la recherche sur Internet, mais aucune mention de cela! Incroyable ... –

+0

Ouais quand j'ai lu ceci j'ai été étonné. J'y ai fait des recherches ce matin et je pense que ça va faire l'affaire. Pour le moment, le filtrage est fait dans la construction de la requête Linq, donc je pense que je peux tester 'All' et si cela n'est pas sélectionné, itérer the peopleCollection. À l'avenir, je prévoyais de refactoriser et d'utiliser une CollectionViewSource pour filtrer la vue sans requérir; Je ne sais pas comment cela fonctionnerait, mais pour cette question, j'ai ma réponse. Je vous remercie! –

+1

@Aviad oui c'est une bonne solution, une chose qui ne vous plaît pas, c'est que vous ne pouvez pas vous lier à la propriété Collection via DataContext car CompositeCollection n'est pas Freezable. Cela peut être travaillé en liant à une ressource statique ... –

0

Supposons que vous ayez un nom ComboBox MyCombo, une entité nommée MyEntity associée à un DomaineService nommé MyDomainService.

Ne pas oublier

using System.ServiceModel.DomainServices.Client; 

et bien sûr l'utilisation de bien travailler avec votre site Web de votre entité et DomainService

Vous appelez un Proc nommé:

void LoadEntities() 
{ 
    MyDomainService_Context = new MyDomainService(); 
    EntityQuery<MyEntity > mQuery = null; 

    mQuery = from q in _Context.GetMyDomainServiceQuery() 
      select q; 

    LoadOperation<MyEntity > loadOpLoadEntities = _Context.Load(mQuery, LoadOpLoadEntitiesCallBack, null); 
} 

Puis, dans la CallBack Fonction:

void LoadOpLoadEntitiesCallBack(LoadOperation<MyEntity> loadOperation) 
{ 
    if (loadOperation.Entities.Count() > 0) 
    { 
     List<MyEntity> mList = new List<MyEntity>(); 
     MyEntity mE = new MyEntity(); 
     mE.Column1 = -1; 
     mE.Column2 = "Default value"; 
     mList.Add(mE); 

     for (int i = 0; i < loadOperation.Entities.Count(); i++) 
     { 
      mList.Add(loadOperation.Entities.ToList()[i]); 
     } 

     this.MyCombo.ItemsSource = mList.ToList(); 
    } 
} 
+0

Il s'agit d'une application MVVM WPF utilisant Linq to SQL. La solution composite a bien fonctionné pendant quelques années, mais merci pour l'apport supplémentaire. –

Questions connexes