Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
This example shows how to bind to an enumeration. Unfortunately there isn't a direct way to use an enumeration as a data binding source. However, the Enum.GetValues(Type) method returns a collection of values. These values can be wrapped in an ObjectDataProvider and used as a data source.
The ObjectDataProvider type provides a convenient way to create an object in XAML and use it as a data source.
Reference the enumeration
Use the ObjectDataProvider type to wrap an array of enumeration values provided by the enumeration type itself. The following steps wrap a HorizontalAlignment enumeration. You can substitute a different enumeration if desired.
Create a new
ObjectDataProvider
as a XAML resource, either in your application XAML or the XAML of the object you're working with. This example uses a window and creates theObjectDataProvider
with a resource key ofEnumDataSource
.<Window.Resources> <ObjectDataProvider x:Key="EnumDataSource" ObjectType="{x:Type sys:Enum}" MethodName="GetValues"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="HorizontalAlignment" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </Window.Resources>
In this example, the
ObjectDataProvider
uses three properties to retrieve the enumeration:Property Description ObjectType
The type of object to be returned by the data provider. In this example, System.Enum. The sys:
XAML namespace is mapped toSystem
.MethodName
The name of the method to run on the System.Enum
type. In this example, Enum.GetValues.MethodParameters
A collection of values to provide to the MethodName
method. In this example, the method takes theSystem.Type
of the enumeration.Effectively, the XAML is breaking down a method call, method name, parameters, and the return type. The
ObjectDataProvider
configured in the previous example is the equivalent of the following code:var enumDataSource = System.Enum.GetValues(typeof(System.Windows.HorizontalAlignment));
Dim enumDataSource = System.Enum.GetValues(GetType(System.Windows.HorizontalAlignment))
Reference the
ObjectDataProvider
resource. The following XAML lists the enumeration values in a ListBox control:<ListBox Name="myComboBox" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource EnumDataSource}}"/>
Full XAML
The following XAML code represents a simple window that does the following:
- Wraps the HorizontalAlignment enumeration in a ObjectDataProvider data source as a resource.
- Provides a ListBox control to list all enumeration values.
- Binds a Button control's HorizontalAlignment property to the selected item in the
ListBox
.
<Window x:Class="ArticleExample.BindEnumFull"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
SizeToContent="WidthAndHeight"
Title="Enum binding">
<Window.Resources>
<ObjectDataProvider x:Key="EnumDataSource"
ObjectType="{x:Type sys:Enum}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="HorizontalAlignment" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel Width="300" Margin="10">
<TextBlock>Choose the HorizontalAlignment value of the Button:</TextBlock>
<ListBox Name="myComboBox" SelectedIndex="0"
ItemsSource="{Binding Source={StaticResource EnumDataSource}}"/>
<Button Content="I'm a button"
HorizontalAlignment="{Binding ElementName=myComboBox, Path=SelectedItem}" />
</StackPanel>
</Window>
See also
.NET Desktop feedback