Ищем WPF ComboBox с флажками - PullRequest
33 голосов
/ 13 мая 2009

Мои гугл-навыки меня подводят. Кто-нибудь слышал о таком контроле для WPF. Я пытаюсь сделать так, чтобы это выглядело так (скриншот winforms).

альтернативный текст http://www.angryhacker.com/toys/up.png

Ответы [ 3 ]

56 голосов
/ 13 мая 2009

Вы можете сделать это самостоятельно, установив шаблон данных в поле со списком. В этой статье показано, как - для списка, но принцип тот же.


Другая статья здесь , возможно, лучше подходит для того, что вы пытаетесь сделать, просто установите в первом столбце шаблона элемента флажок и привяжите его к логическому значению вашего бизнес-объекта.

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsSelected}"
                       Width="20" />
            <TextBlock Text="{Binding DayOfWeek}"
                       Width="100" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>
18 голосов
/ 07 июля 2011

Вот мой комбобокс. Я использую код Мартина Харриса и код по этой ссылке Может ли WPF ComboBox отображать альтернативный текст, если его выбор нулевой?

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

И есть два обработчика - один для обработки щелчка CheckBox и один для формирования текста для 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.

Надеюсь, этот код кому-нибудь пригодится!

7 голосов
/ 05 марта 2015

Попробуйте CheckComboBox из Расширенный набор инструментов WPF . Основным преимуществом для меня является наличие двух списков для привязки:

  • все предметы, доступные для выбора
  • только что выбранные предметы

Я считаю этот подход более практичным. Кроме того, вы можете указать value и display членов коллекций, которые вы связываете.

Если вы не хотите приносить кучу других элементов управления с CheckComboBox, вы можете получить исходный код , это довольно просто (нужно принести Класс селектора также).

...