sobota, 19 listopada 2011

Bindowanie typu wyliczeniowego (Enum) w WPF

Czasami zdarza się iż potrzeba zbindować wartości typu wyliczeniowego do pola a następnie wykonać jakieś działanie.
Bindowanie i w takiej sytuacji nie zawodzi i możemy w prosty sposób zbindować wartość enuma i przesłać ją jako parametr komendy.
Zobaczmy na przykład:
Mamy program w którym mamy typ wyliczeniowy grupa, zawierający dwa elementy: pracownicy i studenci. Grupa będzie wybierana poprzez RadioButton a po wybraniu któregoś z nich dokonujemy obliczeń. Tak więc użyjemy komendy a w niej wyślemy odpowiedni parametr.

W XAML-u sprawa przedstawia się następująco:


Code:
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Vertical">
            <TextBlock Text="Wybierz grupę do której należysz" />
            <RadioButton 
                Content="Studenci" 
                GroupName="Group" 
                Command="{Binding SelectGroupCommand}" 
                CommandParameter="{x:Static local:Group.Students}" />
            <RadioButton 
                Content="Pracownicy" 
                GroupName="Group" 
                Command="{Binding SelectGroupCommand}" 
                CommandParameter="{x:Static local:Group.Workers}" />
        </StackPanel>
    </Grid>
</Window>

W kodzie odbierzemy "kliknięcie" w następujący sposób:

Code:
using System;
using System.ComponentModel;
using Microsoft.Practices.Prism.Commands;

namespace WpfApplication2
{
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        public DelegateCommand<object> SelectGroupCommand
        {
            get { return _selectGroupCommand; }
        }

        private DelegateCommand<object> _selectGroupCommand;
        private void SelectGroup(object group)
        {
            if (group != null)
            {
                if (group is Group)
                {
                    var selectedGroup = (Group)group;
                    //Do something with this...
                }
                else
                {
                    throw new ArgumentException("Argument is not Group object");
                }
            }
            else
            {
                throw new ArgumentNullException("group is null");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}


Brak komentarzy:

Prześlij komentarz