Это самый простой в использовании шаблон элемента. Для этого мы определяем DataTemplate
с помощью DataType
String
и устанавливаем его на ComboBox.ItemTemplate
. Чтобы использовать String
в XAML, нам нужно сослаться на сборку и пространство имен xmlns:system="clr-namespace:System;assembly=mscorlib"
. Для привязки мы используем ObservableCollection<string>
, который содержит относительные пути к вашим изображениям:
Посмотреть модель:
public class ViewModel : INotifyPropertyChanged
{
public TestViewModel()
{
this.ImageSources = new ObservableCollection<string>() { @"Resources\Icons\image.png" };
}
/// <summary>
/// Event fired whenever a child property changes its value.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Method called to fire a <see cref="PropertyChanged"/> event.
/// </summary>
/// <param name="propertyName"> The property name. </param>
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private ObservableCollection<string> imageSources;
public ObservableCollection<string> ImageSources
{
get => this.imageSources;
set
{
this.imageSources = value;
OnPropertyChanged();
}
}
}
Xaml:
<Window x:Class="MainWindow"
xmlns:system="clr-namespace:System;assembly=mscorlib">
<Window.DataContext>
<viewModels:ViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="ComboBoxItemTemplate" DataType="system:String">
<Image Source="{Binding}" Height="100" Width="100"/>
</DataTemplate>
</Window.Resources>
<Grid>
<StackPanel>
<ComboBox ItemTemplate="{StaticResource ComboBoxItemTemplate}"
ItemsSource="{Binding ImageSources}" />
</StackPanel>
</Grid>
</Window>
Чтобы это работало, ваш словарь должен содержать относительные пути к изображениям. Если нет, вы должны конвертировать. Таким образом, вместо инициализации ObservableCollection
в конструкторе, как в примере, вы можете переместить инициализацию в другое место.