Artículo
|
Haciendo Bindings de Enumeraciones en WPF |
Una pregunta muy recurrente cuando explico el Binding es como hacer Binding de Enums a un ComboBox, en este post voy a explicarlo mediante un ejemplo, imaginemos que tenemos la enumeración.
Donde indicamos el tipo de deporte que practicamos, aquí tenéis la clase Persona
Ahora creamos la carga de una ObservableCollection al DataContext
Ahora tenemos dos maneras de enlazar la enumeración por código
o usando solo XAML
Creamos on ObjectDataProvider para el tipo Deporte con el nombre sysEnum, demanera que para enlazarlo con el combo nos quedaría
Si juntamos todo el Xaml de la ventana nos podría quedar
El cs sería
Y nos da como resultado la ventana
Autor del artículo: Oscar Álvarez Guerras
public enum Deporte
{
Futbol,
Baloncesto,
Atletismo,
Balonmano,
Golf
}
Donde indicamos el tipo de deporte que practicamos, aquí tenéis la clase Persona
public class Persona : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private string _nombre;
public string Nombre
{
get
{
return _nombre;
}
set
{
if (value != _nombre)
{
_nombre = value;
NotifyPropertyChanged("Nombre");
}
}
}
private string _apellido1;
public string Apellido1
{
get
{
return _apellido1;
}
set
{
if (value != _apellido1)
{
_apellido1 = value;
NotifyPropertyChanged("Apellido1");
}
}
}
private string _apellido2;
public string Apellido2
{
get
{
return _apellido2;
}
set
{
if (value != _apellido2)
{
_apellido2 = value;
NotifyPropertyChanged("Apellido2");
}
}
}
private Deporte _practico;
public Deporte Practico
{
get
{
return _practico;
}
set
{
if (value != _practico)
{
_practico = value;
NotifyPropertyChanged("Practico");
}
}
}
}
Ahora creamos la carga de una ObservableCollection al DataContext
void Window1_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new ObservableCollection()
{
new Persona("Oscar", "Alvarez", "Guerras", Deporte.Atletismo),
new Persona("Jose", "Rodriguez", "Fernandez", Deporte.Futbol),
new Persona("Jorge", "Elorza", "Blanco", Deporte.Baloncesto),
new Persona("Noelia", "Gomez", "Souto", Deporte.Futbol)
};
}
Ahora tenemos dos maneras de enlazar la enumeración por código
PracticaComboBox.ItemsSource = Enum.GetValues(typeof(Deporte));
o usando solo XAML
<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}" x:Key="sysEnum">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Deporte" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Creamos on ObjectDataProvider para el tipo Deporte con el nombre sysEnum, demanera que para enlazarlo con el combo nos quedaría
<ComboBox ItemsSource="{Binding Source={StaticResource sysEnum}}" SelectedValue="{Binding Practico}" Width="195" />
Si juntamos todo el Xaml de la ventana nos podría quedar
<Window x:Class="WPFtestEnumBindings.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFtestEnumBindings"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="500" Width="500">
<Window.Resources>
<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type System:Enum}" x:Key="sysEnum">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Deporte" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="132*" />
<ColumnDefinition Width="146*" />
</Grid.ColumnDefinitions>
<ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" Grid.Column="0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,10">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Nombre}" Margin="0,0,5,0" />
<TextBlock Text="{Binding Apellido1}" Margin="0,0,5,0"/>
<TextBlock Text="{Binding Apellido2}" />
</StackPanel>
<TextBlock Text="{Binding Practico}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<StackPanel Grid.Column="1">
<StackPanel Orientation="Horizontal">
<Label Content="Nombre: " />
<TextBox Text="{Binding Nombre}" Width="186" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Apellido 1: " />
<TextBox Text="{Binding Apellido1}" Width="177" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Apellido 2: " />
<TextBox Text="{Binding Apellido2}" Width="175" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Content="Practica: " />
<ComboBox ItemsSource="{Binding Source={StaticResource sysEnum}}" SelectedValue="{Binding Practico}" Width="195" />
</StackPanel>
</StackPanel>
</Grid>
</Window>
El cs sería
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WPFtestEnumBindings
{
///
/// Interaction logic for Window1.xaml
///
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new ObservableCollection()
{
new Persona("Oscar", "Alvarez", "Guerras", Deporte.Atletismo),
new Persona("Jose", "Rodriguez", "Fernandez", Deporte.Futbol),
new Persona("Jorge", "Elorza", "Blanco", Deporte.Baloncesto),
new Persona("Noelia", "Gomez", "Souto", Deporte.Futbol)
};
}
}
}
Y nos da como resultado la ventana

Autor del artículo: Oscar Álvarez Guerras
![]() |
Publicado por: Angel Carrero |
|
|
Comentarios
Últimas noticias
· factura
Últimos artículos














































