23 votos

Buscando una WPF ComboBox con casillas de verificación

Mi google habilidades me fallan. Nadie escuchó de un control como el que para WPF. Estoy tratando de hacer que se vea como esta (winforms captura de pantalla).

alt text

36voto

Martin Harris Puntos 18057

Usted puede hacer esto por sí mismo mediante el establecimiento de la plantilla de datos del cuadro combinado. En este artículo se muestra cómo - para un listbox, pero el principio es el mismo.


Otro artículo aquí es tal vez una mejor opción para lo que usted está tratando de hacer, simple conjunto de la primera columna de la plantilla de elemento a ser una opción y se unen 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>

14voto

Sergey Puntos 642

No es mi combobox. Yo uso Martin Harris código y el código desde este enlace Puede WPF control ComboBox texto alternativo cuando su selección es 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 origen 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 handler - uno para el manejo de la Casilla de verificación hacer clic y uno para la formación de Texto para el 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 yo uso

ObservableCollection<SelectableObject<tblObject>> 

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

Espero que este código es útil a alguien!

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X