web-dev-qa-db-fra.com

Recherche d'un WPF ComboBox avec des cases à cocher

Mes compétences Google me manquent. Tout le monde a entendu parler d'un contrôle comme celui-là pour WPF. J'essaie de le faire ressembler à ceci (capture d'écran de Winforms).

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

34
AngryHacker

Vous pouvez le faire vous-même en définissant le DataTemplate de la zone de liste déroulante. Cet article vous montre comment - pour une listbox, mais le principe est le même.


Un autre article ici est peut-être mieux adapté à ce que vous essayez de faire, définissez simplement la première colonne du modèle d'élément comme une case à cocher et liez-la à un booléen sur votre objet métier.

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

Il y a ma combobox. J'utilise le code Martin Harris et le code de ce lien n WPF ComboBox 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 la source de données:

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 gestionnaires - un pour gérer CheckBox cliqué et un pour former du 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 j'utilise

ObservableCollection<SelectableObject<tblObject>> 

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

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

19
Sergey

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

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

Je trouve cette approche plus pratique. De plus, vous pouvez spécifier les membres value et display des collections que vous liez.

Si vous ne voulez pas apporter un tas d'autres contrôles avec CheckComboBox, vous pouvez en obtenir code source , c'est assez simple (besoin d'apporter classe Selector également).

7
Alex Klaus