【问题标题】:How to pass multiple converter parameter in generic Enum to Boolean Converter如何将通用枚举中的多个转换器参数传递给布尔转换器
【发布时间】:2013-09-22 18:20:06
【问题描述】:

我经历过这个How to bind RadioButtons to an enum?

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

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

 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>

【问题讨论】:

    标签: c# wpf xaml converter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      [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}" />
      

      如果你不使用“Flags”属性,你不能像“A|B|D”这样的结果传回你的模型。

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

      【讨论】:

        【解决方案3】:

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

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

        其中 enumBooleanConverter 是上面的转换器

        【讨论】:

        • A;C;F 到底是什么? xaml 如何连接枚举值和枚举集之间的点?
        • A、C 和 F 是枚举值。 EnumToBooleanConverter 连接 xaml 和枚举值之间的点
        • 只是我尝试了类似的方法,但在 xaml 中出现错误。哦,好吧,我做错了:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多