如何在WPF中声明具有枚举值作为Itemsource的组合框项模板?
问题的出现的原因是需要在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值显示相应的图片和文本。