为什么可以使用枚举作为XAML标记?

yfwxisqw  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(134)

为什么下面的WPF/XAML代码可以工作?为什么枚举可以用作XAML标记?还有,为什么转换器参数可以是多个枚举值?请看下面我是如何传入RunningSetup的。我还没有找到任何在线文档来解释这两件事是如何工作的。

<local:CircleSpinner.Visibility>
    <Binding
     Path="CompletionStatus"
     ElementName="_this"
     Converter="{converters:VisibleIfEqualConverter}">
         <Binding.ConverterParameter>
             <enums:ExperimentCompletionStatusEnum>Running,Setup</enums:ExperimentCompletionStatusEnum>
         </Binding.ConverterParameter>
    </Binding>
    <!-- ... -->
unguejic

unguejic1#

为什么枚举可以用作XAML标记?

它是这样设计的,请参阅文档以供参考:XAML Syntax In Detail
使用XAML中的标记定义对象称为对象元素语法。

<Button/>
  • Object元素语法 * 是通过声明XML元素示例化CLR类或结构的XAML标记语法。此语法类似于其他标记语言(如HTML)的元素语法。Object元素语法以左尖括号(〈)开头,后跟示例化的类或结构的类型名称。[...]

由. NET实现的XAML具有一组规则,这些规则将对象元素Map到类型,将属性Map到属性或事件,将XAML命名空间Map到CLR命名空间和程序集。
属性语法允许您将属性用作XAML属性,此处为Content

<Button Content="This is the content of the button"/>

属性语法是XAML标记语法,它通过在现有对象元素上声明属性来设置属性的值。属性名称必须与支持相关对象元素的类的属性的CLR成员名称匹配。[...]
有一种属性元素语法更详细,但允许直接嵌套元素。

<Button>
   <Button.Content>
      This is the content of the button
   </Button.Content>
</Button>

使用elementTypeName.propertyName的开头项目标记来指定属性(Property),并在中指定属性(Property)的值,然后关闭属性(Property)项目,而不是将属性(Property)指定为项目标记内的属性(Attribute)。[...]

为什么converter参数可以是多个枚举值?

C#中的enum可以用Flags属性修饰。
位字段通常用于可能以组合形式出现的元素列表,而枚举常量通常用于互斥元素列表。因此,位字段设计为与按位OR运算组合以生成未命名值,而枚举常量则不是。

[Flags]
public enum ColumnType
{
   A = 1,
   B = 2,
   C = 4
}

此属性允许将枚举视为位字段,例如:

var bitwiseOrResult = A | B;

这就是为什么你可以指定多个逗号分隔的值,就像上面的按位OR一样。这对于一次指定多个值很有用。例如,有一个ModifierKeys枚举,用Flags属性声明,所以你可以有多个修饰符,例如Ctrl + Shift。

如何神奇地进行转换?

XAML如何知道如何将XAML中的字符串转换为枚举,或者如何转换逗号分隔的字符串列表?答案是type converters
在. NET Framework中,TypeConverter类别会做为Managed自订类别实作的一部分,以提供特定的用途,该类别可在XAML属性(Attribute)用法中当做属性(Property)值使用。[...]
在XAML文件中设置属性值时,该值的初始类型是纯文本字符串。对于XAML处理程序,即使是其他原语(如Double)最初也是文本字符串。
如果值是枚举型别,则会使用字串来检查该枚举型别中具名常数的名称相符项目。
简言之,调用类型转换器将字符串转换为声明的类型。有几个内置的转换器,如EnumConverter。如果你感兴趣,请参阅此处的参考源代码。

相关问题