WPF枚举、布尔值绑定combox的ItemsSource

1、枚举绑定combox的ItemsSource

ItemsSource绑定的是个集合值,要想枚举绑定ItemsSource,首先应该想到的是把枚举值变成集合。

方法一:使用资源里的ObjectDataProvider

如以下枚举

    public enum PeopleEnum
    {
        中国人,
        美国人,
        英国人,
        俄罗斯人        
    }

前端绑定:

<Window x:Class="ComboxTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ComboxTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Window.Resources>
        <ObjectDataProvider x:Key="peopleEnum" MethodName="GetValues" ObjectType="{x:Type local:PeopleEnum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="local:PeopleEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    <StackPanel>
        <ComboBox Margin="6" IsReadOnly="True" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource peopleEnum}}"
                              SelectedItem="{Binding People}"></ComboBox>
        <Button Margin="6" Click="show_People">显示选择项</Button>
    </StackPanel>
</Window>
    public partial class MainWindow : Window,INotifyPropertyChanged
    {
        #region 属性改变事件
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

        private PeopleEnum people;

        public PeopleEnum People 
        {
            get => people;
            set { people = value; OnPropertyChanged("People"); }
        }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        private void show_People(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(People.ToString());
        }
    }

方法二:使用EnumerationExtension

有时候公司对编码有要求,比如枚举不能用中文,中文需要写到Description里。

重写一下上面的例子:

public enum PeopleEnum
    {
        [Description("中国人")]
        CHINESE,
        [Description("美国人")]
        AMERICAN,
        [Description("英国人")]
        ENGLISHMAN,
        [Description("俄罗斯人")]
        RUSSIAN        
    }

然后写个枚举拓展的类:

public class EnumerationExtension : MarkupExtension
    {
        private Type _enumType;


        public EnumerationExtension(Type enumType)
        {
            if (enumType == null)
                throw new ArgumentNullException("enumType");

            EnumType = enumType;
        }

        public Type EnumType
        {
            get { return _enumType; }
            private set
            {
                if (_enumType == value)
                    return;

                var enumType = Nullable.GetUnderlyingType(value) ?? value;

                if (enumType.IsEnum == false)
                    throw new ArgumentException("Type must be an Enum.");

                _enumType = value;
            }
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var enumValues = Enum.GetValues(EnumType);

            return (
              from object enumValue in enumValues
              select new EnumerationMember
              {
                  Value = enumValue,
                  Description = GetDescription(enumValue)
              }).ToArray();
        }

        private string GetDescription(object enumValue)
        {
            var descriptionAttribute = EnumType
              .GetField(enumValue.ToString())
              .GetCustomAttributes(typeof(DescriptionAttribute), false)
              .FirstOrDefault() as DescriptionAttribute;


            return descriptionAttribute != null
              ? descriptionAttribute.Description
              : enumValue.ToString();
        }

        public class EnumerationMember
        {
            public string Description { get; set; }
            public object Value { get; set; }
        }
    }

前端使用:

        <ComboBox  Grid.Row="0" Grid.Column="1" Margin="3" MinHeight="28" 
                   ItemsSource="{Binding Source={local:Enumeration {x:Type local:PeopleEnum}}}"
                   DisplayMemberPath="Description"  SelectedValue="{Binding People}"  SelectedValuePath="Value">
        </ComboBox>

这样写代码会简洁很多。

2、布尔值绑定combox的ItemsSource

思路是先有个对应布尔值的枚举,然后用转换器进行转换。

    public enum BoolEnum
    {
        是,
        否
    }
public class BoolEnumConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if ((bool)value == true)
                return BoolEnum.是;
            else
                return BoolEnum.否;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if ((BoolEnum)value == BoolEnum.是)
                return true;
            else
                return false;
        }
    }

前端代码:

<Window x:Class="ComboxTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ComboxTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Window.Resources>
        <ObjectDataProvider x:Key="boolEnum" MethodName="GetValues" ObjectType="{x:Type local:BoolEnum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type Type="local:BoolEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <local:BoolEnumConverter x:Key="boolEnumConverter" />
    </Window.Resources>
    <StackPanel>
        <ComboBox IsReadOnly="True" Margin="6" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource boolEnum}}"
                  SelectedItem="{Binding YesOrNo,Converter={StaticResource boolEnumConverter}}"></ComboBox>
        <Button Margin="6" Click="show_result">显示选择项</Button>
    </StackPanel>
</Window>
public partial class MainWindow : Window,INotifyPropertyChanged
    {
        #region 属性改变事件
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

        private bool yesOrNo=true;

        public bool YesOrNo 
        {
            get => yesOrNo;
            set { yesOrNo = value; OnPropertyChanged("YesOrNo"); }
        }

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }

        private void show_result(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(YesOrNo.ToString());
        }
    }

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值