2009-05-13 26 views
29

Benim google becerilerim beni başarısız. WPF için herkes böyle bir kontrolü duydu. Ben bunun gibi görünmeye çalışıyorum (winforms ekran görüntüsü).Onay kutuları ile bir WPF ComboBox mi arıyorsunuz?

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

+1

[Güzel bir özel denetim uygulamasıdır] (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 metin] (http://blogs.microsoft.co.il/blogs/justguy/image_thumb_44E16700.png) –

cevap

47

Kendinizi açılan kutunun DataTemplate ayarlayarak bunu yapabilirsiniz. This article size nasıl bir liste kutusu olduğunu gösterir, ancak ilke aynıdır.


here belki daha iyi bir uyum yapmaya çalışıyorsun ne içindir başka makale, basit kurulum öğesi şablonunun ilk sütun bir onay kutusu olması ve iş nesne üzerinde bir bool bağlamak o.

+3

Yeniden oluşturmak istiyorsanız -kullanılabilir kontrol ve iş nesnelerinize IsSelected eklemek istemiyor musunuz? –

+1

Combobox'tan devralınan yeni bir özel denetim oluşturabilir ve denetim kutusunun şablonunu, açılır pencerede bulunan denetimi onay kutularını içeren bir listeyle değiştirmek için değiştirebilirsiniz. Kontrol kutusunda kontrol edilen kutucukları işaretleyin ve bir mülkte gösterebileceğiniz kontrol edilen öğelerin listesini saklayın. –

+1

, değil mi? – Philippe

18

Benim combobox'ım var.

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

Ve iki işleyicisi var - CheckBox işlemek için bir tıkladım ve ComboBox için Metin oluşturmak için tek: Ben veri kaynağı için bu bağlantıyı 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" /> 

Küçük sınıf den Martin Harris kodu ve kod kullanabilirsiniz. tblObject benim nesne, ben ComboBox içinde görüntülemek istediğiniz bir listesi türüdür nerede ComboBox.ItemsSource için

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

Ben

ObservableCollection<SelectableObject<tblObject>> 

kullanın.

Umarım bu kod birileri için yararlıdır!

+0

SelectableObject fikrini beğendim. 1! –

+1

imho StackPanel ve TextBlock şablonda gereksizdir, yalnızca ObjectData nesnesinin Content özelliğini bağlayabilir. – Taras

7

Extended WPF Toolkit'dan CheckComboBox'u deneyin. benim için önemli avantajı bağlanma için iki liste yaşıyor:

  • tüm öğeleri mevcut seçim için
  • sadece seçili öğeleri ben bu yaklaşım daha pratik bulmak

. Ayrıca, bağlandığınız koleksiyonların value ve display üyelerini de belirtebilirsiniz. Eğer CheckComboBox ile diğer denetimlerin bir demet getirmek istemiyorsanız

, bunu oldukça düzgün, bunun source code alabilirsiniz (aynı zamanda Selector class getirmek gerekir).

İlgili konular