Привязать изображение к ComboBox на основе значения перечисления объекта
У меня есть Class Character, у которого есть свойство Gender, которое является Enum. То, что я хочу, чтобы мой код делал, - это переключение изображений в зависимости от того, какого пола мой персонаж (если персонаж мужской = мужской).
Проблема в том, как правильно получить доступ и получить значение Enum. Видите ли, я создаю ObservableCollection типа Character. Затем я связываю эту коллекцию с ComboBox и затем отображаю DisplayMemberPath через ItemTemplate.
Я считаю, что я все правильно выполняю привязку, но я неправильно обращаюсь к свойству Character Gender в моем конвертере значений.
XAML: ссылка на конвертер и & ComboBox
xmlns:converters="clr-namespace:ImageViaGenderTest_2014"
Title="MainWindow" Height="350" Width="1004.932">
<Window.Resources>
<converters:GenderToIconFilenameConverter x:Key="IconConverter"/>
</Window.Resources>
<ComboBox x:Name="Character_ComboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="328" Height="25">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="50" Text="{Binding Name}"/>
<TextBlock Width="50" Text="{Binding Level}"/>
<Image Source="{Binding Gender, Converter={StaticResource IconConverter}}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Настройка наблюдаемой коллекции в MainWindow
public ObservableCollection<Character> squad_members = new ObservableCollection<Character>();
public MainWindow()
{
InitializeComponent();
squad_members.Add(new Character() { Name = "john_snow_knows_nothing", Level = 8, _Gender = Gender.Male});
squad_members.Add(new Character() { Name = "Ygritt_gets_wrecked", Level = 4, _Gender = Gender.Female});
Binding comboBinding = new Binding();
comboBinding.Source = squad_members;
BindingOperations.SetBinding(Character_ComboBox, ComboBox.ItemsSourceProperty, comboBinding);
}
Класс преобразователя пользовательских значений (где, я думаю, я неправильно ссылаюсь на перечисление Gender) ОБЛАСТЬ ОШИБКИ:
[ValueConversion(typeof(Gender), typeof(Image))]
public class GenderToIconFilenameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
switch ((Gender)value)
{
case Gender.Female:
return "character1.jpg";
case Gender.Male:
return "character2.jpg";
default:
return null;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
Класс персонажа:
public class Character
{
public string Name { get; set; }
public int Level { get; set; }
public Gender _Gender { get; set; }
}
Пол Enum:
public enum Gender
{
Male, Female
}
Неправильно ли я ссылаюсь на перечисление моего пола персонажа? Или я что-то еще забыл? Я также получил помощь от этого вопроса: Значок привязки в зависимости от Enum в WPF Treeview
1 ответ
Есть решение в чистом xaml
<ComboBox x:Name="Character_ComboBox"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Width="328"
Height="25">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="50"
Text="{Binding Name}" />
<TextBlock Width="50"
Text="{Binding Level}" />
<Image x:Name="gender" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Gender}"
Value="Female">
<Setter Property="Source"
TargetName="gender"
Value="character1.jpg" />
</DataTrigger>
<DataTrigger Binding="{Binding Gender}"
Value="Male">
<Setter Property="Source"
TargetName="gender"
Value="character2.jpg" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
этот подход не требует никакого конвертера, и это выгоднее, когда у вас меньше вариантов.
Здесь происходит то, что мы указали DataTrigger в шаблоне, и мы проверяем значение свойства Gender, и когда оно соответствует определенным критериям, мы соответствующим образом устанавливаем источник изображения.