Привязать изображение к ComboBox на основе значения перечисления объекта

1

У меня есть класс символов, у которого есть свойство Пол, являющийся 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>

Установка Observable Collection в 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);
    }

Класс конвертирования пользовательских значений (где я думаю, что неверно ссылаюсь на гендерное перечисление). ОШИБКА:

[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; }
}

Пол:

public enum Gender
{
    Male, Female
}

Могу ли я неправильно ссылаться на свой персональный реестр? Или что-то еще я забыл? Я также получил помощь от этого вопроса: Bind Icon в зависимости от Enum в WPF Treeview

Теги:
wpf
image
binding
valueconverter

1 ответ

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 и, когда оно соответствует определенным критериям, мы соответствующим образом устанавливаем источник изображения.

  • 0
    это работает, но привязка DataTrigger должна быть <DataTrigger Binding = "{Binding _Gender}">. Акцент на «_Gender» вместо «Пол». Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню