Потребление сложных Comboboxes WPF
Я хочу иметь сложный комбинированный список с флажками, текстом и, возможно, миниатюрой. Я уже просмотрел следующие ссылки, которые мне очень помогли при создании сложных комбо-боксов.
Но я не могу найти способ использовать эти сложные usercontol в моем приложении. Я новичок в WPF, поэтому любая демонстрационная поддержка будет высоко оценена.
Дин, я искал решение о том, как связать код с файлом с помощью следующего примера, упомянутого в посте SO ранее.
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsSelected}"
Width="20" />
<TextBlock Text="{Binding DayOfWeek}"
Width="100" />
</StackPanel>
</DataTemplate>
Итак, вопрос в том, нужен ли мне DataTable или что-то еще, чтобы связать мой список флажков и заголовков с этим шаблоном комбинированного списка? Заранее спасибо
3 ответа
Combobox - это ItemsControl. Все ItemsControls могут быть заполнены "жестко" с элементами или контейнерами.
Это добавляет новую запись в комбинированный список и оборачивает строку в ItemsContainer, который является ComboBoxItem.
<ComboBox>
<sys:string>Hello</string>
<ComboBox>
Здесь мы создаем элемент комбинированного списка напрямую и добавляем его содержимое в строку со значением "Hello"
<ComboBox>
<ComboBoxItem Content="Hello"/>
<ComboBox>
Оба выглядят визуально одинаково. Важно понимать, что в первом случае ComboBox заботится об обёртывании нашей строки неизвестного типа ComboBox в ComboBoxItem и использует DataTemplate по умолчанию для его отображения. DataTemplate по умолчанию будет отображать TextBlock и вызывать ToString() для данного элемента данных.
Теперь, чтобы иметь динамические данные, нам нужна коллекция ObservableCollection с нашими элементами данных.
class Employee
{
public BitmapSource Picture {get;set;}
public string Name{get;set}
}
ObservableCollection<Employee> employees;
myComboBox.ItemsSource = employees;
У нас есть DataClass с именем Employee, наблюдаемая коллекция, которая содержит многие наши элементы данных, и мы установили эту коллекцию как ItemsSource. С этого момента наш Combobox прислушивается к изменениям в этой коллекции. Как добавление и удаление сотрудников, так и автоматическая настройка нового сотрудника в ComboBoxItem. Все делается автоматически. Единственное, что нам нужно сделать, это предоставить правильный DataTemplate. Комбо-бокс не знает, как "отобразить" сотрудника, и именно для этого предназначен DataTemplate.
<DataTemplate x:Key="employeeTemplate">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Picture}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
Мы знаем, что сотрудник упакован в ComboBoxItem, и ComboBoxItem использует предоставленную Datatemplate для отображения своих данных, что означает, что внутри DataTemplate мы можем использовать Binding для доступа ко всем свойствам элемента данных.
Надеюсь, это поможет вам.
Просто ответить на ваш вопрос. все, что вам нужно, - это коллекция объектов с по крайней мере 2 открытыми свойствами (IsSelected как bool и DayOfWeek как строка) и просто установить эту коллекцию как источник элементов. так что все, что вам нужно, это коллекция такого объекта. просто прокомментируйте, если вам нужен пример.
PS: пожалуйста, прочитайте www для wpf и связывания, чтобы получить основы.
Вы можете просто добавить элементы напрямую
<ComboBox>
<ComboBox.Items>
<ComboBoxItem>
<TextBlock Text="test text" />
</ComboBoxItem>
<ComboBoxItem>
<CheckBox Content="test checkbox" />
</ComboBoxItem>
<ComboBoxItem>
<Button Content="test button" />
</ComboBoxItem>
</ComboBox.Items>
</ComboBox>
или если вы хотите использовать ItemsSource, потребуется DataTemplateSelector
<ComboBox>
<ComboBox.ItemTemplateSelector>
<local:MyCustomTemplateSelector />
</ComboBox.ItemTemplateSelector>
</ComboBox>
вот ссылка, которая объясняет DataTemplateSelectors