前言
WPF 的 ComboBox 控件等绑定 enum 值很繁琐,很让人头疼,网上也有提供了一些方法,基本是使用 ObjectDataProvider 方式和 MarkupExtension 方式,
有没有办法绑定值为 enum 类型就自动加载所有枚举值选项,下面记录一种方法;
实现方式
主要通过附加属性,根据绑定的 Selecter.SelectedItem 属性,获取属性类型,再获取枚举值的集合了,下面是实现代码:
添加附加属性 ItemsControlHelper.EnumValuesToItemsSourceProperty
- public class ItemsControlHelper
- {
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>/// <summary>
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>/// 绑定 enum 类型所有值给 ItemsSource 赋值
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>/// 必须绑定 SelectedItem
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>/// </summary>
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>public static readonly DependencyProperty EnumValuesToItemsSourceProperty = DependencyProperty.RegisterAttached(
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>"EnumValuesToItemsSource", typeof(bool), typeof(ItemsControlHelper), new PropertyMetadata(default(bool), OnEnumValuesToItemsSourceChanged));
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>public static void SetEnumValuesToItemsSource(DependencyObject element, bool value)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>element.SetValue(EnumValuesToItemsSourceProperty, value);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>public static bool GetEnumValuesToItemsSource(DependencyObject element)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>return (bool)element.GetValue(EnumValuesToItemsSourceProperty);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>private static void OnEnumValuesToItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (d is ItemsControl itemsControl && GetEnumValuesToItemsSource(itemsControl))
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (itemsControl.IsLoaded)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>SetComboBoxItemsSource(itemsControl);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>else
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>itemsControl.Loaded += ComboBox_Loaded;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>private static void SetComboBoxItemsSource(ItemsControl itemsControl)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var itemsBindingExpression = BindingOperations.GetBinding(itemsControl, ItemsControl.ItemsSourceProperty);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (itemsBindingExpression != null)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>throw new InvalidOperationException("When using ItemsControlHelper.EnumValuesToItemsSource, cannot be used ItemsSource at the same time.");
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (itemsControl.Items.Count > 0)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>throw new InvalidOperationException("When using ItemsControlHelper.EnumValuesToItemsSource, Items Collection must be null");
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var bindingExpression = BindingOperations.GetBindingExpression(itemsControl, Selector.SelectedItemProperty);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (bindingExpression == null)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>throw new InvalidOperationException("ItemsControl must be binding SelectedItem property");
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var binding = bindingExpression.ParentBinding;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var dataType = bindingExpression.DataItem?.GetType();
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var propertyInfo = dataType?.GetProperty(binding.Path.Path);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (propertyInfo == null)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>return;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var propertyType = propertyInfo.PropertyType;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (!propertyType.IsEnum)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var underlyingType = Nullable.GetUnderlyingType(propertyType);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>if (underlyingType == null)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>return;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>propertyType = underlyingType;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var itemsSourceBinding = new Binding();
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>itemsSourceBinding.Source = Enum.GetValues(propertyType);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>itemsSourceBinding.Mode = BindingMode.OneWay;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>itemsControl.SetBinding(ItemsControl.ItemsSourceProperty, itemsSourceBinding);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>private static void ComboBox_Loaded(object sender, RoutedEventArgs e)
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>{
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>var itemsControl = (ItemsControl)sender;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>itemsControl.Loaded -= ComboBox_Loaded;
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid><Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>SetComboBoxItemsSource(itemsControl);
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>}
- }
复制代码
viewmodel 代码创建 枚举类型属性
前端 xaml 代码,将 ComboBox.SelectedItem 绑定枚举属性,并设置 ItemsControlHelper.EnumValuesToItemsSource="True"
- <Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>
复制代码 运行代码,自动加载枚举值集合到 ComboBox.ItemsSource

还可以添加 TypeConverter 的方式显示为自定义字符串,新增一个 EnumDescriptionConverter .cs
枚举添加 Attribute 注释内容- [TypeConverter(typeof(EnumDescriptionConverter))]public enum Animal{<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("小狗")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Dog = 0,<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("小猫")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Cat,<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("大象")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Elephant,<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("小鸟")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Bird,<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("狮子")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Lion,<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>[Description("小脑斧")]<Grid>
- <ComboBox Width="120"
- HorizontalAlignment="Center"
- VerticalAlignment="Center"
- local:ItemsControlHelper.EnumValuesToItemsSource="True"
- SelectedItem="{Binding Animal}" />
- </Grid>Tiger}
复制代码 再次运行代码结果

同理继承 Selector 的控件也可以使用,例如 ListBox :

总结
最后只需要添加一行代码 local:ItemsControlHelper.EnumValuesToItemsSource="True",就可以自动绑定 ItemsSource,xaml 代码不需要再去关注 enum 的类型。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |