36

私のグーグルスキルは私を失敗させます。誰もがWPFのようなコントロールについて聞いたことがあります。私はそれをこのように見せようとしています(winformsスクリーンショット)。

4

3 に答える 3

62

コンボボックスのDataTemplateを設定することにより、これを自分で行うことができます。この記事では、リストボックスの場合の方法を説明しますが、原則は同じです。


ここにある別の記事は、おそらくあなたがやろうとしていることにもっと適しています。アイテムテンプレートの最初の列をチェックボックスに設定し、それをビジネスオブジェクトのブール値にバインドするだけです。

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsSelected}"
                       Width="20" />
            <TextBlock Text="{Binding DayOfWeek}"
                       Width="100" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
于 2009-05-13T17:29:35.830 に答える
22

私のコンボボックスがあります。Martin Harrisコードとこのリンクのコードを使用します。WPFComboBoxは、選択が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つはクリックされたCheckBoxを処理するためのもので、もう1つは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;
}

ComboBox.ItemsSourceには、私が使用します

ObservableCollection<SelectableObject<tblObject>> 

ここで、tblObjectはオブジェクトのタイプであり、そのリストをComboBoxに表示します。

このコードが誰かに役立つことを願っています!

于 2011-07-07T06:28:08.640 に答える
9

ExtendedWPFToolkitのCheckComboBoxを試してみてください。私にとっての主な利点は、バインディング用に2つのリストがあることです。

  • 選択可能なすべてのアイテム
  • 選択したアイテム

このアプローチの方が実用的だと思います。さらに、バインドするコレクションのメンバーを指定できvalueますdisplay

を使用して他の多くのコントロールを持ち込みたくない場合は、そのソースコードCheckComboBoxを取得できます。これは非常に簡単です(Selectorクラスも持ち込む必要があります)。

于 2015-03-05T05:44:33.570 に答える