2010-01-28 7 views
16

Ich habe eine ComboBox in einer WPF-Anwendung, die an eine ObservableCollection von Department-Objekte in einer C# ViewModel-Klasse gebunden ist. Ich möchte das Kombinationsfeld verwenden, um eine andere Sammlung nach Abteilung zu filtern (und in der Tat funktioniert das jetzt) ​​Das Problem ist, dass ich eine zusätzliche Option "Alle" an den Anfang der Liste hinzufügen möchte. Gibt es einen richtigen Weg, dies zu tun? Eine falsche Abteilung zu manipulieren fühlt sich in vielerlei Hinsicht falsch an.Wie fügen Sie ein generisches Element zu einer ComboBox an eine Auflistung in WPF

Die ComboBox

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

Antwort

22

Sie eine CompositeCollection als Itemssource für die ComboBox verwenden könnte die Option "Alle" zu schließen. Sie müssen die Collection-Eigenschaft des CollectionContainer auf Ihre "ObservableCollection of Department-Objekte" festlegen.

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

nicht sicher, ob dies jedoch für Ihre Filter Situation geeignet sein wird ...

+1

+1 Wow als erfahrener WPF-Programmierer war mir nicht einmal "CompositeCollection" bewusst! Bei der Suche im Internet gibt es alle möglichen Problemumgehungen, aber keine erwähnen dies! Unglaublich ... –

+0

Ja, als ich das las, war ich erstaunt. Ich habe heute Morgen ein bisschen darüber nachgedacht und ich denke, dass es den Trick machen wird. Im Moment wird die Filterung im Aufbau der Linq-Abfrage durchgeführt, also denke ich, dass ich nach 'All' testen kann und wenn das nicht ausgewählt ist, iteriere die peopleCollection. In der Zukunft plane ich Refactoring und benutze eine CollectionViewSource, um die Ansicht ohne Requerying zu filtern; Ich bin mir nicht sicher, wie das funktionieren würde, aber für diese Frage habe ich meine Antwort. Danke! –

+1

@Aviad Ja, es ist eine nette Lösung, eine Sache, die ein wenig saugt, ist, dass Sie nicht über DataContext an die Collection-Eigenschaft binden können, da CompositeCollection nicht Freezable ist. Dies kann man umgehen, indem man an eine statische Ressource bindet ... –

0

Angenommen, Sie haben eine ComboBox namens MyCombo, ein Unternehmen MyEntity in Verbindung mit einem DomaineService namens MyDomainService benannt.

Vergessen Sie nicht,

using System.ServiceModel.DomainServices.Client; 

und natürlich die Verwendung von gut arbeiten mit Ihrer Website Ihres Unternehmens und Domainservice

Sie rufen einen Namen Proc:

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); 
} 

dann in der CallBack Funktion:

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

Dies ist eine MVVM WPF-App, die Linq zu SQL verwendet. Die Composite COlction-Lösung funktioniert seit ein paar Jahren sehr gut, aber danke für den zusätzlichen Input. –

Verwandte Themen