簡體   English   中英

如何將通用枚舉中的多個轉換器參數傳遞給布爾轉換器

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

我已經通過這個如何將RadioButtons綁定到枚舉?

並接受這個問題的答案包含使用泛型Enum到布爾轉換器。

我的問題是我在View中有兩個單選按鈕和一個枚舉

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

在ViewModel中,我有一個Called屬性

public LinkType MyLinktype
{
  get;set;
}

如果ViewModel中enum的屬性具有A,C,E中的值,則第一個單選按鈕可以為true,如果ViewModel中的枚舉屬性具有值,則第二個單選按鈕可以為true。 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”屬性是解決問題的關鍵:

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

其中enumBooleanConverter是上面的轉換器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM