如何在WPF中声明具有枚举值作为Itemsource的组合框项模板?

14 浏览
0 Comments

如何在WPF中声明具有枚举值作为Itemsource的组合框项模板?

我有一个枚举,假设是这样的:

enum MyEnum
{
  FirstImage,
  SecondImage,
  ThirdImage,
  FourthImage
};

我已经将这个枚举绑定到了我的XAML中的下拉框。

在定义下拉框时,我定义了一个ItemTemplate来接受两个UI元素:

  1. 显示枚举值(描述)的TextBlock
  2. 图像

我在XAML中已经完成了这些。我想知道在下拉框中的每个枚举值对应的图像应该在哪里指定?这可以通过数据触发器来实现吗?

如果有人有这种情况下的XAML,我将非常感激。

非常感谢。

0
0 Comments

问题的出现的原因是需要在WPF中声明一个带有Enum值作为Itemsource的combobox itemTemplate。解决方法是使用DataTrigger或Converter来实现。

具体解决方法如下:

1. 在XAML中声明一个ObjectDataProvider,用于获取Enum的所有值:

<ObjectDataProvider x:Key="EnumDataProvider" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="local:Decade"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

2. 创建一个Converter类,实现IValueConverter接口,并在Convert方法中根据Enum值返回相应的图片路径:

public class DecadeEnumImageConverter : IValueConverter
{
    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        var myEnum = ( Decade )Enum.Parse( typeof( Decade ), value.ToString() );
        switch( myEnum )
        {
            case Decade.Ninties:
                return "/EnumToImage/images/90s.jpg";
            case Decade.Eighties:
                return "/EnumToImage/images/80s.jpg";
            case Decade.Seventies:
                return "/EnumToImage/images/70s.jpg";
            case Decade.Sixties:
                return "/EnumToImage/images/60s.jpg";
            case Decade.Fifties:
                return "/EnumToImage/images/50s.jpg";
            case Decade.Forties:
                return "/EnumToImage/images/40s.jpg";
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
    public object ConvertBack( object value, Type targetType, object parameter, CultureInfo culture )
    {
        throw new NotImplementedException();
    }
}

3. 在XAML中声明两个不同的DataTemplate,一个使用Converter来显示图片和文本,另一个使用DataTrigger来显示图片和文本:

<DataTemplate x:Key="ItemsTemplateWithConverter">
    <StackPanel Orientation="Horizontal">
        <Image Width="64" Height="32" Source="{Binding Converter={StaticResource ImageConverter}}"/>
        <TextBlock Text="{Binding}" VerticalAlignment="Center" />
    </StackPanel>
</DataTemplate>
<DataTemplate x:Key="ItemsTemplateWithDataTrigger">
    <ContentControl Template="{StaticResource ImageTemplate}" />
</DataTemplate>

4. 最后,在需要使用combobox的地方,设置ItemTemplate为前面声明的两个DataTemplate之一:

<ComboBox Margin="10" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" ItemTemplate="{StaticResource ItemsTemplateWithConverter}" />

通过上述步骤,就可以在WPF中声明一个带有Enum值作为Itemsource的combobox itemTemplate,并根据不同的Enum值显示相应的图片和文本。

0