2010-01-28 14 views
16

Tengo un ComboBox en una aplicación WPF que está vinculada a un ObservableCollection de objetos Departamento en una clase C# ViewModel. Quiero usar el cuadro combinado para filtrar otra colección por departamento (y de hecho funciona ahora). El problema es que quiero agregar una opción adicional "Todos" al principio de la lista. ¿Hay una forma correcta de hacer esto? Hacer un departamento falso se siente mal de muchas maneras.Cómo agregar un elemento genérico a un ComboBox vinculado a una colección en WPF

El ComboBox

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

Respuesta

22

Se puede usar un CompositeCollection como el ItemsSource para el cuadro combinado para incluir la opción "Todos". Debe establecer la propiedad Collection de CollectionContainer en su "ObservableCollection of Department objects".

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

No estoy seguro si esto va a ser adecuado para su situación filtrado sin embargo ...

+1

+1 ¡Wow como experimentado programador de WPF ni siquiera estaba al tanto de 'CompositeCollection'! Hay todo tipo de soluciones para esto cuando se busca en Internet, ¡pero ninguno menciona esto! Increíble ... –

+0

Sí, cuando lo leí me sorprendió. He estado investigando esta mañana y creo que hará el truco. En este momento, el filtrado se realiza en la construcción de la consulta de Linq, así que estoy pensando que puedo probar "Todos" y, si eso no está seleccionado, repito iteración de PeopleCollection. En el futuro, estaba planeando refactorizar y usar un CollectionViewSource para filtrar la vista sin necesidad de volver a consultar; No estoy seguro de cómo funcionaría, pero para esta pregunta tengo mi respuesta. ¡Gracias! –

+1

@Aviad sí, es una buena solución, una cosa que apesta un poco es que no se puede unir a la propiedad Collection a través de DataContext ya que CompositeCollection no es Freezable. Esto puede resolverse mediante el enlace a un recurso estático ... –

0

Suponga que tiene un cuadro combinado llamado MyCombo, una entidad llamada MyEntity asociado con un DomaineService nombrado MyDomainService.

No se olvide

using System.ServiceModel.DomainServices.Client; 

y por supuesto el uso de trabajar bien con su sitio web de su entidad y DomainService

Se llama a un Proc llamado:

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

Luego, en el CallBack función:

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

Esta es una aplicación MVVM WPF que utiliza Linq a SQL. La solución Composite COllection ha funcionado bastante bien durante un par de años, pero gracias por la entrada adicional. –

Cuestiones relacionadas