4

我已经通过这个如何将 RadioButtons 绑定到枚举?

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

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

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

在 ViewModel 我有一个属性叫做

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>
4

3 回答 3

9

您可以在 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>

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

于 2013-09-18T05:57:34.037 回答
3

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

[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”之类的结果传输回模型。

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

于 2013-09-18T08:30:13.247 回答
1

您可以使用以下枚举到布尔转换器

 [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 中你可以使用 like

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

其中 enumBooleanConverter 是上述转换器

于 2013-09-18T06:16:25.893 回答