4

私はこのHow to bind RadioButtons to an enum?を経験しました。

この質問に対する受け入れられた回答には、一般的な Enum から Boolean へのコンバーターの使用が含まれています。

私の問題は、ビューに2つのラジオボタンと列挙型があることです

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

ViewModel には、Called プロパティがあります。

public LinkType MyLinktype
{
  get;set;
}

ViewModel の列挙型のプロパティが A、C、E の値を持つ場合、最初のラジオ ボタンは true になり、ViewModel の列挙型のプロパティが値を持つ場合、2 番目のラジオ ボタンは true になります。B,D,F

したがって、次のような一般的な EnumTo Boolean コンバーターのコンバーターパラメーターに複数の値を渡すにはどうすればよいですか

 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

3

まず、「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" のような結果をモデルに戻すことはできません。

最後に、私の拙い英語についてお詫び申し上げます。^-^

于 2013-09-18T08:30:13.247 に答える