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

本文关键字:转换器 参数传递 布尔 枚举 | 更新日期: 2023-09-27 18:31:38

>我已经经历了如何将单选按钮绑定到枚举?

并且对此问题的接受答案包含使用通用枚举到布尔转换器。

我的问题是我在视图中有两个单选按钮和一个枚举

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

在视图模型中,我有一个名为

public LinkType MyLinktype
{
  get;set;
}
如果 ViewModel 中枚举的属性在

A、C、E 之间具有值,则我的第一个单选按钮可以为真,如果 ViewModel 中枚举的属性具有值,则第二个单选按钮可以为真。B,D,F

那么,如何在通用 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);
        }

那么,如果我想要在 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>

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

您可以在 xaml 中定义一个数组:

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

然后将其作为参数传递

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

您必须修复转换器,以便正确处理数组作为转换器参数。

首先,我认为"标志"属性是解决问题的关键:

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

然后,我像这样实现转换器:

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
}

而且,在 Xaml 中,您可以像这样使用它:

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

也像这样:

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

如果不使用"标志"属性,则无法传输结果,例如"A|B|D"回到您的模型。

最后,我应该为我糟糕的英语道歉。 ^-^

您可以使用

以下枚举到布尔转换器

 [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;
} 

}

在 XAML 中,您可以使用类似

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

其中枚举布尔转换器是上面的转换器