[英]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.