2009-05-13 12 views
29

私のGoogleスキルが失敗します。誰でもWPFのようなコントロールを聞いた。私はそれをこのように見せようとしています(winformsのスクリーンショット)。チェックボックス付きのWPFコンボボックスを探している

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あなたが再作成する必要がある場合はどうすればいいでしょうか?[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

コンボボックスから継承する新しいカスタムコントロールを作成し、コントロールのテンプレートを変更して、ポップアップにあるコントロールをチェックボックスを含むリストに置き換えることができます。コントロールのCheckedイベントを確認し、プロパティで公開可能なチェック済みアイテムのリストを維持します。 –

+1

、そうではありませんか? – Philippe

18

私のコンボボックスがあります。私は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" /> 

このリンクから、マーティン・ハリスコードとコードを使用するデータソースの小クラス:

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

そして2件のハンドラがある - クリックチェックボックスとコンボボックスのテキストを形成するための1つを処理するための一つ。

私はtblObjectは私のオブジェクトの種類、私はコンボボックスに表示するかのリストである

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

このコードが誰かにとって便利だと思います!

+0

私はSelectableObjectのアイデアが好きでした。 +1! –

+1

テンプレート内のimho StackPanelとTextBlockは冗長なので、チェックボックスのContentプロパティをObjectDataにバインドできます。 – Taras

7

CheckComboBoxを試してください。Extended WPF Toolkitから

  • を選択できるすべての項目
  • だけで、選択した項目

私はこのアプローチは、より実用的な検索:私にとって 主な利点は、結合のための二つのリストを持っています。さらに、バインドしているコレクションのメンバーをvaluedisplayと指定することができます。

CheckComboBoxで他のコントロールを使用したくない場合は、source codeを得ることができます。これはかなり簡単です(Selector classも必要です)。

関連する問題