À la recherche d'un ComboBox WPF avec des cases à cocher

mes compétences google me laissent tomber. Quelqu'un a entendu parler d'un contrôle comme celui-là pour WPF. J'essaie de le faire ressembler à ceci (winforms screenshot).

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

29
demandé sur AngryHacker 2009-05-13 21:12:31

3 réponses

vous pouvez le faire vous-même en paramétrant le DataTemplate de la boîte bascule. cet article vous montre comment - pour une listbox, mais le principe est le même.


un autre article ici est peut-être un meilleur ajustement pour ce que vous essayez de faire, simple mettre la première colonne du modèle d'article pour être une case à cocher et le lier à un bool sur votre objet d'affaires.

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsSelected}"
                       Width="20" />
            <TextBlock Text="{Binding DayOfWeek}"
                       Width="100" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
50
répondu Martin Harris 2011-01-17 14:23:36

Voilà mon combobox. J'utilise le code et le code de Martin Harris à partir de ce lien un ComboBox WPF peut-il afficher un texte alternatif lorsque sa sélection est nulle?

<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" />

petite classe pour datasource:

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

et il y a deux handler - un pour la manipulation case à cocher cliqué et un pour la formation de texte pour 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;
    }

Pour ComboBox.ItemsSource-je utiliser

ObservableCollection<SelectableObject<tblObject>> 

où tblObject est le type de mon objet, une liste que je veux afficher dans ComboBox.

j'espère que ce code est utile à quelqu'un!

18
répondu Sergey 2017-05-23 11:46:30

essayez CheckComboBox from Extended WPF Toolkit . Le principal avantage pour moi est d'avoir deux listes pour la liaison:

  • tous les éléments disponibles pour la sélection
  • juste les éléments sélectionnés

je trouve cette approche plus pratique. En outre, vous pouvez spécifier value et display membres des collections que vous liez.

Si vous ne voulez pas d'apporter un tas d'autres contrôles CheckComboBox , vous pouvez obtenir le code source , c'est assez simple (il faut apporter Sélecteur de classe ).

7
répondu Alex Klaus 2015-03-05 06:06:00