简体   繁体   English

如何将通用枚举中的多个转换器参数传递给布尔转换器

[英]How to pass multiple converter parameter in generic Enum to Boolean Converter

I have been through this How to bind RadioButtons to an enum? 我已经通过这个如何将RadioButtons绑定到枚举?

and accepted answer to this question contains use of generic Enum to Boolean converter. 并接受这个问题的答案包含使用泛型Enum到布尔转换器。

my problem is that I am having two radio buttons in View and an enum 我的问题是我在View中有两个单选按钮和一个枚举

 public Enum LinkType
   {
       A,
       B,
       C,
       D,
       E,
       F
    }

In ViewModel I have a property Called 在ViewModel中,我有一个Called属性

public LinkType MyLinktype
{
  get;set;
}

my first radio button can be true if property of enum in ViewModel is having value among A,C,E and second radio button can be true if property of enum in ViewModel is having value among. 如果ViewModel中enum的属性具有A,C,E中的值,则第一个单选按钮可以为true,如果ViewModel中的枚举属性具有值,则第二个单选按钮可以为true。 B,D,F B,d,F

So, How can I pass multiple values in the converter parameter in generic EnumTo Boolean Converter which is as following 那么,如何在通用EnumTo布尔转换器中的转换器参数中传递多个值,如下所示

 public class EnumBooleanConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string parameterString = parameter as string;
            if (parameterString == null)
                return DependencyProperty.UnsetValue;

            if (Enum.IsDefined(value.GetType(), value) == false)
                return DependencyProperty.UnsetValue;

            object parameterValue = Enum.Parse(value.GetType(), parameterString);

            return parameterValue.Equals(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string parameterString = parameter as string;
            if (parameterString == null)
                return DependencyProperty.UnsetValue;

            return Enum.Parse(targetType, parameterString);
        }

So what changes I have to make in converter if I want something like this in the XAML 那么如果我想在XAML中使用这样的东西,我必须在转换器中做出哪些改变

<RadioButton IsChecked="{Binding Path=MyLinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter=A,C,F}">Odd LinkType</RadioButton>

 <RadioButton IsChecked="{Binding Path=Mylinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter=B,D,E}">Even Link Type</RadioButton>

You can define an array in xaml: 您可以在xaml中定义一个数组:

        <x:Array Type="LinkType" x:Key="ar">
            <LinkType>A</LinkType>
            <LinkType>B</LinkType>
        </x:Array>

And then pass it as parameter 然后将其作为参数传递

<RadioButton IsChecked="{Binding Path=MyLinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter={StaticResource ar}}">Odd LinkType</RadioButton>

You'll have to fix your converter tho, in order to properly handle array as converter parameter. 您必须修复转换器,以便正确处理数组作为转换器参数。

Firstly, I think "Flags" attribute is the key to resolve the problem: 首先,我认为“Flags”属性是解决问题的关键:

[Flags]
public enum LinkType
{
    A=1,
    B=2,
    C=4,
    D=8,
    E=16
}

And then, I implement the converter like this: 然后,我像这样实现转换器:

public class LinkTypeToBoolCvt : IValueConverter
{
    #region | Members of IValueConverter |

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        // please refer to the implementation of "CallBack" method
        throw new NotImplementedException();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null || parameter == null) return DependencyProperty.UnsetValue;

        var param= parameter.ToString();
        int result;
        if (int.TryParse(param,out result))
        {
            // ex: if the parameter is 11, the result will be "A|B|D"
            return result;
        }
        else
        {
            // ex: if the parameter is "A|E", the result will be 17
            var enums = param.Split(new []{"|"}, StringSplitOptions.RemoveEmptyEntries);

            LinkType lt = 0;
            LinkType ltTemp = 0;

            foreach (var item in enums)
            {
                if (Enum.TryParse<LinkType>(item, out ltTemp)) lt |= ltTemp;
            }

            if (lt == 0) return DependencyProperty.UnsetValue;
            else return lt;
        }
    } 

    #endregion
}

And, in Xaml you can use it like this: 而且,在Xaml中你可以像这样使用它:

<RadioButton IsChecked="{Binding .MyLinkType,Converter={StaticResource LinkTypeToBoolCvt},ConverterParameter=11}" />

Also like this: 也像这样:

<RadioButton IsChecked="{Binding .MyLinkType,Converter={StaticResource LinkTypeToBoolCvt},ConverterParameter=A|B|D}" />

if you dont use "Flags" attribute, you cannot transfer the result like "A|B|D" back to your model. 如果您不使用“标志”属性,则无法将结果如“A | B | D”传回模型。

Finally, I should apologize for my poor english. 最后,我应该为我可怜的英语道歉。 ^-^ ^ - ^

You can use following enum to boolean converter 您可以使用以下枚举到布尔转换器

 [ValueConversion(typeof(Enum), typeof(bool))]
 public class EnumToBooleanConverter : IValueConverter
 {
   public object Convert(object value,
                      Type targetType,
                      object parameter,
                      CultureInfo culture)
       {
         if (
             (value == null) 
             || 
             (!(value is Enum))
             ||
             (parameter == null)
             )
                {
                   return false;
                }

  foreach (Enum paramValue in ParseObjectToEnum(value.GetType(),
                                                parameter))
  {
    if (value.Equals(paramValue))
    {
      return true;
    } 
  }

  return false;
}



public object ConvertBack(object value,
                          Type targetType,
                          object parameter,
                          CultureInfo culture)
{
  object result = Binding.DoNothing;

  if ((bool)value)
  {
    Enum[] parsedValues = ParseObjectToEnum(targetType,
                                            parameter);
    if (parsedValues.Length > 0)
    {
      result = parsedValues[0];
    } 
  }
  return result;
} 


private static Enum[] ParseObjectToEnum(Type enumType,
                                        object value)
{
  var enumValue = value as Enum;
  if (enumValue != null)
  {
    return new[] { enumValue };
  }

  var str = value as string;
  if (string.IsNullOrEmpty(str))
  {
    throw new ArgumentException("parameter");
  }

  string[] strArray = str.Split(new[] { ';', ',' },
                                StringSplitOptions.RemoveEmptyEntries);
  var enumArray = new Enum[strArray.Length];
  for (int i = 0;
       i < strArray.Length;
       i++)
  {
    enumArray[i] = (Enum)Enum.Parse(enumType,
                                    strArray[i],
                                    true);
  }

  return enumArray;
} 

} }

and in xaml you can use like 在xaml你可以使用喜欢

<RadioButton IsChecked="{Binding Path=MyLinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter=A;C;F}">Odd LinkType</RadioButton>

where enumBooleanConverter is the above converter 其中enumBooleanConverter是上面的转换器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM