为什么下面的WPF/XAML代码可以工作?为什么枚举可以用作XAML标记?还有,为什么转换器参数可以是多个枚举值?请看下面我是如何传入Running
和Setup
的。我还没有找到任何在线文档来解释这两件事是如何工作的。
<local:CircleSpinner.Visibility>
<Binding
Path="CompletionStatus"
ElementName="_this"
Converter="{converters:VisibleIfEqualConverter}">
<Binding.ConverterParameter>
<enums:ExperimentCompletionStatusEnum>Running,Setup</enums:ExperimentCompletionStatusEnum>
</Binding.ConverterParameter>
</Binding>
<!-- ... -->
1条答案
按热度按时间unguejic1#
为什么枚举可以用作XAML标记?
它是这样设计的,请参阅文档以供参考:XAML Syntax In Detail。
使用XAML中的标记定义对象称为对象元素语法。
由. NET实现的XAML具有一组规则,这些规则将对象元素Map到类型,将属性Map到属性或事件,将XAML命名空间Map到CLR命名空间和程序集。
属性语法允许您将属性用作XAML属性,此处为
Content
。属性语法是XAML标记语法,它通过在现有对象元素上声明属性来设置属性的值。属性名称必须与支持相关对象元素的类的属性的CLR成员名称匹配。[...]
有一种属性元素语法更详细,但允许直接嵌套元素。
使用
elementTypeName.propertyName
的开头项目标记来指定属性(Property),并在中指定属性(Property)的值,然后关闭属性(Property)项目,而不是将属性(Property)指定为项目标记内的属性(Attribute)。[...]为什么converter参数可以是多个枚举值?
C#中的
enum
可以用Flags
属性修饰。位字段通常用于可能以组合形式出现的元素列表,而枚举常量通常用于互斥元素列表。因此,位字段设计为与按位OR运算组合以生成未命名值,而枚举常量则不是。
此属性允许将枚举视为位字段,例如:
这就是为什么你可以指定多个逗号分隔的值,就像上面的按位OR一样。这对于一次指定多个值很有用。例如,有一个
ModifierKeys
枚举,用Flags
属性声明,所以你可以有多个修饰符,例如Ctrl + Shift。如何神奇地进行转换?
XAML如何知道如何将XAML中的字符串转换为枚举,或者如何转换逗号分隔的字符串列表?答案是type converters。
在. NET Framework中,TypeConverter类别会做为Managed自订类别实作的一部分,以提供特定的用途,该类别可在XAML属性(Attribute)用法中当做属性(Property)值使用。[...]
在XAML文件中设置属性值时,该值的初始类型是纯文本字符串。对于XAML处理程序,即使是其他原语(如
Double
)最初也是文本字符串。如果值是枚举型别,则会使用字串来检查该枚举型别中具名常数的名称相符项目。
简言之,调用类型转换器将字符串转换为声明的类型。有几个内置的转换器,如
EnumConverter
。如果你感兴趣,请参阅此处的参考源代码。