c# - 根据对象枚举值将图像绑定(bind)到组合框

标签 c# wpf image binding valueconverter

我有一个字符类,其属性 Gender 是一个枚举。我希望我的代码做的是根据我的角色的性别切换图像(如果角色是男性=男性图像)。

我遇到的问题是如何正确访问和获取此枚举值。你看,我正在创建一个字符类型的 ObservableCollection。然后,我将此集合绑定(bind)到 ComboBox,然后通过 ItemTemplate 显示 DisplayMemberPath。

我相信我所做的所有绑定(bind)都是正确的,但我没有在值转换器中正确访问“角色性别”属性。

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>

主窗口中的可观察集合设置

  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 depending on Enum in WPF Treeview

最佳答案

纯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 属性的值,当它满足特定条件时,我们相应地设置图像源。

关于c# - 根据对象枚举值将图像绑定(bind)到组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25499717/

相关文章:

c# - 如何在 WPF 中创建带标题和排序的多列 TreeView?

android - 显示来自 byteArray 的图像

css - 当宽度超过最大宽度时,如何使图像走出div?

c# - Web 上下文中静态属性的影响

c# - 内存读写字节

c# - 如何模拟作为接口(interface)的接口(interface)属性

c# - 停止 Autofac 归档 IEnumerable<>

c# - 如何在 OxyPlot 中强制 x 轴保持在 0?

c# - 使用触摸滑动拖动打开 WPF 扩展器

html - 背景图像未正常显示在 div 中或悬停时显示