ComboBox
наследуется косвенно от ItemsComntrol
.Для эффективного отображения вашего контента на ItemsControl
вы должны установить макет для контента вашего элемента на ItemTemplate
класса ItemsControl
, который был получен (в данном случае ComboBox
).
Обзор шаблонов данных В статье Microsoft описывается, как использовать шаблоны данных для определения макета для отображения вашего контента в WPF.
Определение DataTemplate
для отображения вашего контента на ComboBox
было бы так просто:
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Path=MyImageSource}" Height="15"/>
<TextBlock Margin="5 0 0 0" Text="{Binding Path=MyText}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Теперь, чтобы использовать это правильно, вам просто нужен класс, подобный этому:
public class MyCoolData
{
public ImageSource MyImageSource { get; set; }
public string MyText { get; set; }
}
Затем вы можете получить некоторую коллекцию с MyCoolData
объекты и задайте его как значение вашего ComboBox
свойства ItemsSource
или, альтернативно, вы можете вручную добавить или удалить MyCoolData
объекты непосредственно в Items
свойстве ComboBox
.В приведенной выше статье Microsoft приведено несколько примеров.Или, чтобы добавить свои MyCoolData
объекты в ComboBox
, вы можете просто объявить их в XAML, как показано в следующем примере:
<ComboBox>
<local:MyCoolData MyText="My first item" MyImageSource="MyFirstImage.png"/>
<local:MyCoolData MyText="My second item" MyImageSource="MySecondImage.jpg"/>
<local:MyCoolData MyText="Another one" MyImageSource="CoolImage.png"/>
</ComboBox>
Обратите внимание, что приведенные выше примеры позволяют вамиметь свой собственный объект (в данном случае, объект MyCoolData
) и использовать его непосредственно как элемент в ComboBox
.Механизм шаблонизации данных ComboBox
(предоставляется ItemsControl
) позаботится о создании макета для правильного отображения объекта MyCoolData
в виде ComboBoxItem
.Механизм шаблонов данных использует DataTemplate
, который мы определили в приведенном выше примере, чтобы знать, как отображать ваш объект, и при необходимости создает элементы макета для каждого из ваших MyCoolData
объектов.В итоге это становится более эффективным, потому что вы пишете меньше кода и упрощаете его изменение, а также позволяет более эффективно использовать виртуализированные панели, если бы это было так.