2009-05-13 28 views
29

Le mie competenze su google non mi soddisfano. Qualcuno ha sentito di un controllo del genere per WPF. Sto cercando di renderlo simile a questo (screenshot di winforms).Ricerca di un ComboBox WPF con caselle di controllo

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

+1

[Ecco una bella implementazione del controllo personalizzato] (http://blogs.microsoft.co.il/blogs/justguy/archive/2009/01/19/wpf-combobox-with-checkboxes-as-items-it -will-even-update-on-the-fly.aspx)! [alt text] (http://blogs.microsoft.co.il/blogs/justguy/image_thumb_44E16700.png) –

risposta

47

È possibile farlo da soli impostando il DataTemplate della casella combinata. This article mostra come - per una listbox, ma il principio è lo stesso.


Un altro articolo here è forse una misura migliore per ciò che si sta cercando di fare, semplice insieme la prima colonna del modello di voce da una casella di controllo e associarlo a un bool sul vostro oggetto di business.

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

Cosa succede se si desidera creare un re -controllo utile e non vuoi aggiungere IsSelected ai tuoi oggetti business? –

+1

È possibile creare un nuovo controllo personalizzato ereditato da Combobox e modificare il modello del controllo per sostituire il controllo presente nel popup con un elenco che include le caselle di controllo. Ascolta le caselle di controllo Verifica evento nel controllo e mantieni un elenco di elementi selezionati che puoi esporre attraverso una proprietà. –

+1

Dovrebbe essere , non dovrebbe? – Philippe

18

C'è la mia casella combinata. Io uso il codice e il codice Martin Harris da questo link Can a WPF ComboBox display alternative text when its selection is 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" /> 

piccola classe per origine dati:

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

e non c'è due gestore - uno per la gestione CheckBox cliccato e uno per la formazione di testo per 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; 
    } 

Per ComboBox.ItemsSource Io uso

ObservableCollection<SelectableObject<tblObject>> 

dove tblObject è tipo del mio oggetto, il cui elenco voglio visualizzare in ComboBox.

Spero che questo codice sia utile a qualcuno!

+0

Mi è piaciuta l'idea di SelectableObject. +1! –

+1

imho StackPanel e TextBlock nel modello sono ridondanti, potrebbero solo associare la proprietà Content della casella di controllo a ObjectData. – Taras

7

Provare a CheckComboBox da Extended WPF Toolkit. Il vantaggio principale per me è avere due liste per il legame:

  • tutti gli elementi disponibili per la selezione
  • articoli appena selezionati

Trovo che questo approccio più pratico. Inoltre, puoi specificare value e display membri delle raccolte che stai vincolando.

Se non si vuole portare un po 'di altri controlli con CheckComboBox, è possibile ottenere il source code di esso, è abbastanza semplice (necessario portare Selector class pure).

Problemi correlati