Ищем WPF ComboBox с флажками
Мои навыки работы с Google меня подводят. Кто-нибудь слышал о таком контроле для WPF. Я пытаюсь сделать так, чтобы это выглядело так (скриншот winforms).
4 ответа
Вы можете сделать это самостоятельно, установив DataTemplate поля со списком. В этой статье показано, как - для списка, но принцип тот же.
Другая статья здесь, возможно, лучше подходит для того, что вы пытаетесь сделать, просто установите в первом столбце шаблона элемента флажок и привяжите его к логическому значению вашего бизнес-объекта.
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected}"
Width="20" />
<TextBlock Text="{Binding DayOfWeek}"
Width="100" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
Вот мой комбобокс. Я использую код Мартина Харриса и код этой ссылки Может ли 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.
Надеюсь этот код кому-то пригодится!
Попробуйте CheckComboBox из расширенного инструментария WPF. Основным преимуществом для меня является наличие двух списков для привязки:
- все предметы, доступные для выбора
- только что выбранные предметы
Я считаю этот подход более практичным. Кроме того, вы можете указать value
а также display
члены коллекций вы обязательны.
Если вы не хотите принести кучу других элементов управления с CheckComboBox
Вы можете получить его исходный код, это довольно просто (нужно также привести класс Selector).
ComboBox с флажками
<ComboBox Height="16" Width="15">
<CheckBox Content="First Checkbox" />
<CheckBox Content="Second Checkbox" />
<CheckBox Content="Third Checkbox" />
<TextBlock Text="Some Text" />
</ComboBox>
Предоставленные ответы на удивление не сработали для меня, я пробовал много вариантов и продолжал получать сообщения об ошибках о том, что флажок не является частью поля со списком, и контекст данных, казалось, был нарушен.
В конце концов мне не пришлось ничего делать с шаблонами данных или каким-либо кодом, и мои привязки работают нормально (не показано в примере).
Я должен сказать, что доволен тем, насколько легко это оказалось после прочтения всех ответов.