C# 如何在XAML中使用枚举类型?

C# 如何在XAML中使用枚举类型?,c#,wpf,xaml,triggers,enums,C#,Wpf,Xaml,Triggers,Enums,我正在学习WPF,遇到了以下问题: 我在XAML之外的另一个命名空间中有一个枚举类型: public enum NodeType { Type_SYSTEM = 1, // System Type_DB = 2, // Database Type_ROOT = 512, // Root folder Type_FOLDER = 1024, // Folde

我正在学习WPF,遇到了以下问题:

我在XAML之外的另一个命名空间中有一个枚举类型:

 public enum NodeType
 {
    Type_SYSTEM = 1,              // System
    Type_DB     = 2,              // Database
    Type_ROOT   = 512,            // Root folder
    Type_FOLDER = 1024,           // Folder
 }
在我的XAML中,我想用一个整数触发一个图像

<Image.Style>
    <Style TargetType="{x:Type Image}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Type}" Value="{NodeType: }">
                <Setter Property="Source" Value="/Images/DB.PNG"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Type}" Value="128">
                <Setter Property="Source" Value="/Images/SERVER.PNG"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Image.Style>
我有一个类似的问题,我的最终结果是创建一个泛型,它传递了我想要匹配的
enum
值作为
ConverterParameter
,它返回
true
false
,这取决于绑定值是否匹配enum的
(int)

最终结果如下所示:

XAML代码:

<DataTrigger Value="True"
             Binding="{Binding SomeIntValue, 
                 Converter={StaticResource IsIntEqualEnumConverter},
                 ConverterParameter={x:Static local:NodeType.Type_DB}}">

您只需要确保您的名称空间在XAML头中得到了说明,然后就可以直接在标记中引用自定义DPs和枚举值

例如,我使用以下代码来实现:

<DataTemplate.Triggers>
  <MultiDataTrigger>
    <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" />
      <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
      <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" />
    </MultiDataTrigger.Setters>
  </MultiDataTrigger>
</DataTemplate.Triggers>

请注意,您不能访问样式中的DataTriggers,而是需要为此创建DataTemplate或ControlTemplate(不过,.NET 4添加了在样式中设置触发器的功能)。您可以使用以下样式替代ControlTemplate:

<Style x:Key="MyCustomButtonStyle" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <ContentPresenter />
        <ControlTemplate.Triggers>
          <!-- Put your DataTriggers here -->
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>


对于要绑定到对象的DataTemplates,只需使用ContentPresenter并将其内容设置为要显示的对象以及用于显示对象的DataTemplate定义。总是有一种方法可以使用DataTriggers,它并不总是直接的,也不像使用样式那么简单。

谢谢您的回复!如果我的“节点类型”在另一个名称空间中,如何在xaml中导入?@user1696549您可以使用根标记中的
xmlns
将其他名称空间添加到xaml中。例如,此行将把程序集
MyAssembly
中的命名空间
MyNamespace
添加到XAML文件中,它可以被前缀
“local”
引用:
xmlns:local=“clr namespace:MyAssembley.MyNamespace;assembly=MyAssembly”
我已成功导入了命名空间,但XAML告诉我“NodeType”命名空间中不存在…我的命名空间是“XFramework.domain.helpers”并且我的枚举位于同一命名空间中的XHelper类中。@user1696549如果您的枚举位于名为
XHelper
的类中,但出现错误:不支持嵌套类型,则可能需要使用类似
local:XHelper.NodeType.Type_DB
!是的,您可以像这里显示的那样在XAML中将枚举与枚举进行比较,但这个问题是关于将枚举与整数进行比较的,据我所知,如果没有转换器或自定义行为,您无法做到这一点。此外,您可以将触发器设置为问题示例代码中OP所示的样式:)我没有编辑问题标题的声誉,但我认为该标题具有误导性:“我如何在XAML中使用枚举类型?”没有提及整数和整数比较,标题将更清楚“如何将枚举与XAML中的整数进行比较?此外,您不能将DataTrigger放在Style元素中,普通触发器不能测试绑定。重要的是阅读整个问题,而不是标题。我真的不想做出改变,因为这是一个老问题,它会把问题推到最上面,但如果这是一个新问题,我会:另外,也许我误解了你的意思,但我相当肯定你可以将DataTriggers放在Style.Triggers中。我总是这么做。试着给你的风格添加一个DataTrigger。找个时间触发集合。Visual Studio IDE和编译器都将抛出错误,让您知道DataTrigger不是Style.Triggers集合中允许的子级。DataTriggers仅在保证存在DataContext的地方被有意允许:在DataTemplate或ControlTemplate中。编辑:显然,我没有注意到.NET4.0和VisualStudio2013中的更改。我的错!啊,我明白了,我没意识到。我想这一定是版本差异或误解,因为你似乎确信事实如此:)
<DataTemplate.Triggers>
  <MultiDataTrigger>
    <MultiDataTrigger.Conditions>
      <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True" />
      <Condition Binding="{Binding Type}" Value="{x:Static loc:AppProfileItemType.Custom}" />
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
      <Setter TargetName="PART_Delete" Property="Visibility" Value="{x:Static Visibility.Visible}" />
    </MultiDataTrigger.Setters>
  </MultiDataTrigger>
</DataTemplate.Triggers>
<Style x:Key="MyCustomButtonStyle" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <ContentPresenter />
        <ControlTemplate.Triggers>
          <!-- Put your DataTriggers here -->
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>