How to bind RadioButtons to an enum?

前端 未结 9 2099
日久生厌
日久生厌 2020-11-22 03:21

I\'ve got an enum like this:

public enum MyLovelyEnum
{
    FirstSelection,
    TheOtherSelection,
    YetAnotherOne
};

I got a property in

9条回答
  •  别那么骄傲
    2020-11-22 04:06

    Based on the EnumToBooleanConverter from Scott. I noticed that the ConvertBack method doesn't work on the Enum with flags code.

    I've tried the following code:

    public class EnumHasFlagToBooleanConverter : IValueConverter
        {
            private object _obj;
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                _obj = value;
                return ((Enum)value).HasFlag((Enum)parameter);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                if (value.Equals(true))
                {
                    if (((Enum)_obj).HasFlag((Enum)parameter))
                    {
                        // Do nothing
                        return Binding.DoNothing;
                    }
                    else
                    {
                        int i = (int)_obj;
                        int ii = (int)parameter;
                        int newInt = i+ii;
                        return (NavigationProjectDates)newInt;
                    }
                }
                else
                {
                    if (((Enum)_obj).HasFlag((Enum)parameter))
                    {
                        int i = (int)_obj;
                        int ii = (int)parameter;
                        int newInt = i-ii;
                        return (NavigationProjectDates)newInt;
    
                    }
                    else
                    {
                        // do nothing
                        return Binding.DoNothing;
                    }
                }
            }
        }
    

    The only thing that I can't get to work is to do a cast from int to targetType so I made it hardcoded to NavigationProjectDates, the enum that I use. And, targetType == NavigationProjectDates...


    Edit for more generic Flags Enum converter:

        public class FlagsEnumToBooleanConverter : IValueConverter {
            private int _flags=0;
            public object Convert(object value, Type targetType, object parameter, string language) {
                if (value == null) return false;
                _flags = (int) value;
                Type t = value.GetType();
                object o = Enum.ToObject(t, parameter);
                return ((Enum)value).HasFlag((Enum)o);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, string language)
            {
                if (value?.Equals(true) ?? false) {
                    _flags = _flags | (int) parameter;
                }
                else {
                    _flags = _flags & ~(int) parameter;
                }
                return _flags;
            }
        }
    

提交回复
热议问题