C# 如何在XAML中使用枚举类型?
我正在学习WPF,遇到了以下问题: 我在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
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>