wpf 如何将通用枚举中的多个转换器参数传递给布尔转换器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18864627/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to pass multiple converter parameter in generic Enum to Boolean Converter
提问by Yogesh
I have been through this How to bind RadioButtons to an enum?
我已经完成了如何将 RadioButtons 绑定到枚举?
and accepted answer to this question contains use of generic Enum to Boolean converter.
这个问题的公认答案包含使用通用枚举到布尔转换器。
my problem is that I am having two radio buttons in View and an enum
我的问题是我在视图中有两个单选按钮和一个枚举
public Enum LinkType
{
A,
B,
C,
D,
E,
F
}
In ViewModel I have a property Called
在 ViewModel 我有一个属性叫做
public LinkType MyLinktype
{
get;set;
}
my first radio button can be true if property of enum in ViewModel is having value among A,C,E and second radio button can be true if property of enum in ViewModel is having value among. B,D,F
如果 ViewModel 中枚举的属性在 A、C、E 中具有值,我的第一个单选按钮可以为真,如果 ViewModel 中的枚举属性在 A、C、E 中具有值,则第二个单选按钮可以为真。乙、丁、甲
So, How can I pass multiple values in the converter parameter in generic EnumTo Boolean Converter which is as following
那么,如何在通用 EnumTo Boolean Converter 中的转换器参数中传递多个值,如下所示
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);
}
So what changes I have to make in converter if I want something like this in the XAML
那么如果我想在 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>
回答by Nikita B
You can define an array in xaml:
您可以在 xaml 中定义一个数组:
<x:Array Type="LinkType" x:Key="ar">
<LinkType>A</LinkType>
<LinkType>B</LinkType>
</x:Array>
And then pass it as parameter
然后将其作为参数传递
<RadioButton IsChecked="{Binding Path=MyLinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter={StaticResource ar}}">Odd LinkType</RadioButton>
You'll have to fix your converter tho, in order to properly handle array as converter parameter.
您必须修复您的转换器,以便将数组正确处理为转换器参数。
回答by lyphoon
Firstly, I think "Flags" attribute is the key to resolve the problem:
首先,我认为“Flags”属性是解决问题的关键:
[Flags]
public enum LinkType
{
A=1,
B=2,
C=4,
D=8,
E=16
}
And then, I implement the converter like this:
然后,我像这样实现转换器:
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
}
And, in Xaml you can use it like this:
而且,在 Xaml 中,您可以像这样使用它:
<RadioButton IsChecked="{Binding .MyLinkType,Converter={StaticResource LinkTypeToBoolCvt},ConverterParameter=11}" />
Also like this:
也像这样:
<RadioButton IsChecked="{Binding .MyLinkType,Converter={StaticResource LinkTypeToBoolCvt},ConverterParameter=A|B|D}" />
if you dont use "Flags" attribute, you cannot transfer the result like "A|B|D" back to your model.
如果您不使用“Flags”属性,则无法将“A|B|D”之类的结果传输回您的模型。
Finally, I should apologize for my poor english. ^-^
最后,我应该为我糟糕的英语道歉。^-^
回答by Mohd Ahmed
You can use following enum to boolean converter
您可以使用以下枚举到布尔转换器
[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;
}
}
}
and in xaml you can use like
在 xaml 中你可以使用像
<RadioButton IsChecked="{Binding Path=MyLinktype, Converter={StaticResource enumBooleanConverter}, ConverterParameter=A;C;F}">Odd LinkType</RadioButton>
where enumBooleanConverter is the above converter
其中 enumBooleanConverter 是上面的转换器

