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).
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>
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!
Essayez de CheckComboBox de Extended WPF Toolkit . Le principal avantage pour moi est d'avoir deux listes pour la liaison:
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).