是否可以创建一个通用的 Int-to-Enum 转换器?
我希望能够将
<DataTrigger Binding="{Binding SomeIntValue}"
Value="{x:Static local:MyEnum.SomeValue}">
如果 int
值等于 (int)MyEnum.Value
,
其解析为 True
我知道我可以制作一个返回 (MyEnum)intValue
的 Converter
,但是我必须为我在 DataTriggers 中使用的每个 Enum 类型制作一个转换器。
有没有一种通用的方法来创建一个转换器来为我提供这种功能?
I'd like to be able to say
<DataTrigger Binding="{Binding SomeIntValue}"
Value="{x:Static local:MyEnum.SomeValue}">
and to have it resolve as True
if the int
value is equal to (int)MyEnum.Value
I know I could make a Converter
that returns (MyEnum)intValue
, however then I'd have to make a converter for every Enum type I use in my DataTriggers.
Is there a generic way to create a converter that would give me this kind of functionality?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
可以以可重用的方式在枚举值与其基础整型类型之间创建转换器——也就是说,您不需要为每个枚举类型定义新的转换器。为此,已为
Convert
和ConvertBack
提供了足够的信息。调用时,此转换器纯粹根据
value
和targetType
值在 int/enum 值之间翻转值的类型。没有硬编码的枚举类型。It is possible to create a converter between enum values and their underlying integral types in a reusable way -- that is, you don't need to define a new converter for each enum types. There's enough information provided to
Convert
andConvertBack
for this.When invoked, this converter flips the value's type between int/enum value based purely on the
value
andtargetType
values. There are no hard-coded enum types.我想我发现
我只需要设置我的
ConverterParameter
而不是Value
等于我正在寻找的枚举,并评估 True/False转换器
I think I figured it out
I just needed to set my
ConverterParameter
instead of theValue
equal to the Enum I am looking for, and evaluate for True/FalseConverter
您还可以采取相反的方式,使用自定义标记扩展将枚举转换为 int 作为值。
示例
EnumToIntExtension
You could also go the other way around and convert the enum to int for the Value using a custom Markup Extension.
Example
EnumToIntExtension
过去我们也曾多次想这样做,因此我们构建了几个扩展方法(在 int、long 等上)来帮助我们解决这个问题。所有这些的核心都是在单个静态泛型 TryAsEnum 方法中实现的:
此实现处理具有任何基础类型的枚举,以及使用 [Flags] 属性定义的枚举。
We've wanted to do this a few times in the past as well, so we built several extension methods (on int, long, etc) to help us out. The core of all of these is implemented in a single static generic TryAsEnum method:
This implementation handles Enums with any underlying type, as well as enums defined with the [Flags] attribute.
您可以对 int 值执行 ToString() 操作,然后将其传递到静态 Enum.Parse 或 Enum.TryParse 方法,该方法采用您关心的枚举类型并返回适当的值。
但这不是一个完美的解决方案,因为它不适用于表示多个枚举值的二进制 ORing 的整数
You could do a ToString() on the int value and then pass that into the static Enum.Parse or Enum.TryParse method which takes the enum type you care about and returns the appropriate value.
This isn't a perfect solution though because it won't work with integers that represent the binary ORing of multiple enum values