I'm learning WPF and I encountered the following problem:
I have an enum type in another namespace than my 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
<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?
My enum is in namespace AnotherNamespace.Types
<DataTrigger Binding="{Binding IntegerType}" Value="MyEnumType.Type_DB"> <Setter Property="Source" Value="/Images/SERVER.PNG"/> </DataTrigger>
The enum can be of any numeric data type such as byte, sbyte, short, ushort, int, uint, long, or ulong. However, an enum cannot be a string type.
An enum type is a special data type that enables for a variable to be a set of predefined constants. The variable must be equal to one of the values that have been predefined for it.
Enumeration is a user defined datatype in C language. It is used to assign names to the integral constants which makes a program easy to read and maintain. The keyword “enum” is used to declare an enumeration. Here is the syntax of enum in C language, enum enum_name{const1, const2, ....... };
I had a similar question here, and my end result was to create a generic IValueConverter that 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.
The end result looks like this:
XAML Code:
<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; }
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.
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:
<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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With