2009-05-13 6 views
29

Google 기술이 실패합니다. 누구나 WPF 용 컨트롤에 대해 들어 봤습니다. 나는 이것을 (winforms screenshot)처럼 보이게하려고 노력하고있다.체크 박스가 포함 된 WPF ComboBox 찾기

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

+1

[다음은 멋진 사용자 정의 컨트롤 구현입니다.] (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) –

답변

47

당신은 자신을 콤보 상자의 DataTemplate을 설정하여이 작업을 수행 할 수 있습니다. This article은 어떻게리스트 박스를 보여 주나 원칙은 동일합니다.


here 아마도 더 잘 맞는 당신이 뭘 하려는지에 대한 또 다른 기사는 간단한 세트는 항목 템플릿의 첫 번째 열은 확인란하고 비즈니스 오브젝트에 부울에 바인딩합니다.

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

다시 만들려면 어떻게해야합니까? 사용할 수있는 컨트롤이고 비즈니스 개체에 IsSelected를 추가하고 싶지 않습니까? –

+1

Combobox로부터 상속받은 새로운 커스텀 컨트롤을 생성하고 컨트롤의 템플릿을 변경하여 팝업에있는 컨트롤을 체크 박스를 포함한리스트로 대체 할 수 있습니다. 컨트롤의 Checked 이벤트를 확인하고 속성을 통해 노출 할 수있는 체크 된 항목의 목록을 유지합니다. –

+1

, 그렇지 않아야합니까? – Philippe

18

내 콤보 박스가 있습니다.

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

를 그리고 두 개의 핸들러가 - 체크 박스를 처리하기위한 하나의 클릭과 콤보 상자의 텍스트를 형성 한 : 나는 데이터 소스에 대한 링크 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" /> 

작은 클래스에서 마틴 해리스 코드와 코드를 사용합니다. tblObject 내 객체, 내가 콤보 상자에 표시 할 목록의 유형입니다 ComboBox.ItemsSource를 들어

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

나는

ObservableCollection<SelectableObject<tblObject>> 

를 사용합니다.

이 코드가 유용한 정보가 아닐까요?

+0

SelectableObject라는 아이디어가 마음에 들었습니다. +1! –

+1

imho StackPanel 및 템플릿의 TextBlock이 중복되어 있으므로 확인란의 Content 속성을 ObjectData에 바인딩 할 수 있습니다. – Taras

7

CheckComboBox에서 시도하십시오. Extended WPF Toolkit에서. 나에게 가장 큰 장점은 바인딩이 목록을 가지고있다 :

  • 모든 항목을 사용할 수 선택에
  • 단지 선택한 항목 나는이 방법이 더 실용적 찾을

을. 또한 바인딩하는 컬렉션의 구성원 인 valuedisplay을 지정할 수 있습니다.

CheckComboBox과 함께 다른 컨트롤을 가져 오지 않으려면 source code을 가져올 수 있습니다. 매우 간단합니다 (Selector class도 가져와야 함).

관련 문제