À 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).
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>
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!
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 ).