2009-05-13 16 views
29

Mis habilidades de Google me fallan. Alguien ha oído hablar de un control como ese para WPF. Estoy tratando de que se vea así (captura de pantalla de winforms).Buscando un WPF ComboBox con casillas de verificación

alt text http://www.angryhacker.com/toys/up.png

+1

[Aquí hay una buena implementación de control personalizado] (http://blogs.microsoft.co.il/blogs/justguy/archive/2009/01/19/wpf-combobox-with-checkboxes-as-items-it -will-even-update-on-the-fly.aspx)! [alt text] (http://blogs.microsoft.co.il/blogs/justguy/image_thumb_44E16700.png) –

Respuesta

47

Puede hacerlo usted mismo mediante el establecimiento de la DataTemplate del cuadro combinado. This article le muestra cómo - para un cuadro de lista, pero el principio es el mismo.


Otro artículo here es tal vez un mejor ajuste para lo que está tratando de hacer, simple conjunto de la primera columna de la plantilla de elementos para ser una casilla de verificación y enlazarlo a un bool en su objeto de negocio.

<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox IsChecked="{Binding IsSelected}" 
         Width="20" /> 
      <TextBlock Text="{Binding DayOfWeek}" 
         Width="100" /> 
     </StackPanel> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 
+3

¿Qué sucede si desea crear un re -usable control y no desea agregar IsSelected a sus objetos comerciales? –

+1

Puede crear un nuevo control personalizado que herede de Combobox y alterar la plantilla del control para reemplazar el control que se encuentra en la ventana emergente con una lista que incluye las casillas de verificación. Escuche las casillas de verificación del evento marcado en el control y mantenga una lista de elementos marcados que puede exponer a través de una propiedad. –

+1

Debe ser , ¿no es así? – Philippe

18

Hay mi cuadro combinado. Yo uso Martin Harris código y el código de este enlace Can a WPF ComboBox display alternative text when its selection is null?

<ComboBox Name="cbObjects" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="2,2,6,0" SelectionChanged="OnCbObjectsSelectionChanged" > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding IsSelected}" Width="20" VerticalAlignment="Center" Checked="OnCbObjectCheckBoxChecked" Unchecked="OnCbObjectCheckBoxChecked" /> 
       <TextBlock Text="{Binding ObjectData}" VerticalAlignment="Center" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 
<TextBlock IsHitTestVisible="False" Name="tbObjects" Text="Выберите объекты..." Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" Margin="6,2,6,0" /> 

pequeña clase de fuente de datos:

public class SelectableObject <T> { 
    public bool IsSelected { get; set; } 
    public T ObjectData { get; set; } 

    public SelectableObject(T objectData) { 
     ObjectData = objectData; 
    } 

    public SelectableObject(T objectData, bool isSelected) { 
     IsSelected = isSelected; 
     ObjectData = objectData; 
    } 
} 

y hay dos manipulador - uno para el manejo de CheckBox hecho clic y uno para la formación de texto de ComboBox.

private void OnCbObjectCheckBoxChecked(object sender, RoutedEventArgs e) { 
     StringBuilder sb = new StringBuilder(); 
     foreach (SelectableObject<tblObject> cbObject in cbObjects.Items) 
      if (cbObject.IsSelected) 
       sb.AppendFormat("{0}, ", cbObject.ObjectData.Description); 
     tbObjects.Text = sb.ToString().Trim().TrimEnd(','); 
    } 

    private void OnCbObjectsSelectionChanged(object sender, SelectionChangedEventArgs e) { 
     ComboBox comboBox = (ComboBox)sender; 
     comboBox.SelectedItem = null; 
    } 

Para ComboBox.ItemsSource utilizo

ObservableCollection<SelectableObject<tblObject>> 

donde tblObject es mi tipo de objeto, una lista de lo que quiero mostrar en el cuadro combinado.

¡Espero que este código sea útil para alguien!

+0

Me gustó la idea de SelectableObject. +1! –

+1

imho StackPanel y TextBlock en la plantilla son redundantes, podrían vincular la propiedad Content de checkbox a ObjectData. – Taras

7

Dale un vistazo a CheckComboBox de Extended WPF Toolkit. La ventaja principal para mí es tener dos listas para la unión:

  • todos los artículos disponibles para la selección
  • artículos apenas seleccionados

Encuentro este enfoque más práctico. Además, puede especificar value y display miembros de las colecciones que vincula.

Si no quiere traer a un montón de otros controles con CheckComboBox, se puede obtener el source code de la misma, es bastante sencillo (necesita traer Selector class también).

Cuestiones relacionadas