2009-05-13 11 views
29

Moje umiejętności w zakresie obsługi Google zawiodły mnie. Ktoś słyszał o takiej kontroli dla WPF. Próbuję sprawić, aby wyglądał tak (zrzut ekranu WinForm).Poszukuję WPF ComboBox z polami wyboru

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

+1

[Tutaj jest ładne wdrożenie niestandardowej kontroli] (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) –

Odpowiedz

47

Można to zrobić samemu ustawiając DataTemplate z pola kombi. This article pokazuje, jak - dla listbox, ale zasada jest taka sama.


Kolejny artykuł here jest chyba lepiej pasuje do tego, co staramy się robić, prosty zestaw pierwsza kolumna szablonu poz się wyboru i powiązać go z bool na swoim obiekcie biznesowym.

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

Co jeśli chcesz utworzyć ponowne -użyteczne sterowanie i nie chcesz dodawać IsSelected do twoich obiektów biznesowych? –

+1

Można utworzyć nowy kontrolek niestandardowy, który dziedziczy z programu Combobox i zmienić szablon kontrolki w celu zastąpienia kontrolki znajdującej się w wyskakującym okienku z listą zawierającą pola wyboru. Wysłuchaj zdarzenia Checked zdarzenia w formancie i utrzymuj listę sprawdzanych elementów, które możesz wyeksponować za pośrednictwem właściwości. –

+1

Powinna to być , nieprawdaż? – Philippe

18

Istnieje mój combobox. Używam kod Martin Harris i kod z tego łącza 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" /> 

małej klasy dla źródła danych:

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

I nie ma dwóch obsługi - jeden do obsługi CheckBox kliknął i jeden do tworzenia tekstu do 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; 
    } 

Dla ComboBox.ItemsSource używam

ObservableCollection<SelectableObject<tblObject>> 

gdzie tblObject jest rodzaj mojego obiektu, wykaz, który chcę wyświetlić w ComboBox.

Mam nadzieję, że ten kod przyda się komuś!

+0

Podobał mi się pomysł SelectableObject. +1! –

+1

imho StackPanel i TextBlock w szablonie są zbędne, mogą po prostu powiązać właściwość Content of checkbox z ObjectData. – Taras

7

Spróbuj przed CheckComboBox z Extended WPF Toolkit. Główną zaletą dla mnie jest o dwie listy do wiązania:

  • wszystkie przedmioty dostępne do wyboru
  • tylko wybrane elementy

Uważam to podejście bardziej praktyczne. Ponadto możesz określić value i display członków powiązanych kolekcji.

Jeśli nie chcesz wnieść kilka innych kontroli z CheckComboBox można uzyskać source code z nim, to całkiem proste (trzeba przynieść Selector class również).