C# 如何在 XAML 中使用枚举类型?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14279602/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I use enum types in XAML?
提问by davymartu
I'm learning WPF and I encountered the following problem:
我正在学习WPF,遇到了以下问题:
I have an enum type in another namespace than my XAML:
我在另一个命名空间中有一个枚举类型而不是我的 XAML:
public enum NodeType
{
Type_SYSTEM = 1, // System
Type_DB = 2, // Database
Type_ROOT = 512, // Root folder
Type_FOLDER = 1024, // Folder
}
in my XAML I'd like to trigger an image with an integer
在我的 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>
Is there a way to get an integer value and compare it with an enum type directly in XAML code?
有没有办法直接在 XAML 代码中获取整数值并将其与枚举类型进行比较?
My enum is in namespace AnotherNamespace.Types
我的枚举在命名空间中 AnotherNamespace.Types
<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB">
<Setter Property="Source" Value="/Images/SERVER.PNG"/>
采纳答案by Rachel
I had a similar question here, and my end result was to create a generic IValueConverterthat passed the enum
value I wanted to match in as the ConverterParameter
, and it returns true
or false
depending on if the bound value matches the (int)
value of the Enum.
我在这里有一个类似的问题,我的最终结果是创建一个通用的IValueConverter,它传递enum
我想要匹配的值作为ConverterParameter
,它返回true
或false
取决于绑定值是否与(int)
枚举的值匹配。
The end result looks like this:
最终结果如下所示:
XAML Code:
XAML 代码:
<DataTrigger Value="True"
Binding="{Binding SomeIntValue,
Converter={StaticResource IsIntEqualEnumConverter},
ConverterParameter={x:Static local:NodeType.Type_DB}}">
Converter
转换器
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter == null || value == null) return false;
if (parameter.GetType().IsEnum && value is int)
{
return (int)parameter == (int)value;
}
return false;
}
回答by tpartee
You just need to make sure that your namespace is accounted-for in your XAML header then you can reference both custom DPs and enum values directly in your markup.
您只需要确保您的命名空间在您的 XAML 标头中得到考虑,然后您就可以直接在您的标记中引用自定义 DP 和枚举值。
For example I use this code to do just that:
例如,我使用此代码来做到这一点:
<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>
Note that you can't access DataTriggers in a Style, you need to instead make a DataTemplate or ControlTemplate for that (however, .NET 4 adds the ability to set triggers in styles). You can override the ControlTemplate from a Style like so:
请注意,您不能在样式中访问 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>
For DataTemplates you want to have bindings to an object, you can simply use a ContentPresenter and set its content to the object you want to display along with a DataTemplate definition to use for display of the object. There's always a way to use DataTriggers it's just not always direct or as simple as using a Style.
对于希望绑定到对象的 DataTemplate,您可以简单地使用 ContentPresenter 并将其内容设置为要显示的对象以及用于显示对象的 DataTemplate 定义。总有一种方法可以使用 DataTriggers,但并不总是直接或像使用 Style 那样简单。