Работа с RadioButton в MVVM

Предлагаю Вашему вниманию пример того, как можно, используя шаблон проектирования Model View ViewModel, работать с такими контролами как RadioButton. Я пересмотрел немного примеров и этот мне понравился больше всего.
Итак, допустим, у нас есть форма, на которой есть 3 радио кнопки:

 



 

Вот XAML этой формы:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <GroupBox Header="Приоритет" Margin="15" Grid.Row="0">
        <StackPanel>
            <RadioButton Content="Низкий" IsChecked="{Binding IsLowPriority}" Margin="3"/>
            <RadioButton Content="Средний" IsChecked="{Binding IsMiddlePriority}" Margin="3"/>
            <RadioButton Content="Высокий" IsChecked="{Binding IsHighPriority}" Margin="3"/>
        </StackPanel>
    </GroupBox>
    <StackPanel Grid.Row="1" Orientation="Horizontal" >
        <TextBlock Text="Вы выбрали:" Margin="5" FontWeight="Bold" FontSize="14"/>
        <TextBlock Text="{Binding GetResult}" Margin="5" FontWeight="Bold" FontSize="14"/>
    </StackPanel>
</Grid>

 

Теперь перейдем к написанию нашего ViewModel. Для значений кнопок используем перечисление Priority:

enum Priority
{
    Low,
    Middle,
    High
}

public class ViewModel : ViewModelBase
{
    Priority priority = Priority.High;

    public Priority Priority
    {
        get { return priority; }
        set
        {
            if (priority == value)
                return;

            priority = value;
            OnPropertyChanged("Priority");
            OnPropertyChanged("IsLowPriority");
            OnPropertyChanged("IsMiddlePriority");
            OnPropertyChanged("IsHighPriority");
            OnPropertyChanged("GetResult");
        }
    }

    public bool IsLowPriority
    {
        get { return Priority == Priority.Low; }
        set { Priority = value ? Priority.Low : Priority; }
    }

    public bool IsMiddlePriority
    {
        get { return Priority == Priority.Middle; }
        set { Priority = value ? Priority.Middle : Priority; }
    }

    public bool IsHighPriority
    {
        get { return Priority == Priority.High; }
        set { Priority = value ? Priority.High : Priority; }
    }
}

 

Я добавил еще одно свойство GetResult которое выступает как бы конвертером значений на русский язык. К нему я привязал TextBlock который показывает какой элемент выбран:

public string GetResult
{
    get
    {
        switch (Priority)
        {
            case Priority.Low:
                return "Низкий";
            case Priority.Middle:
                return "Средний";
            case Priority.High:
                return "Высокий";
        }
        return "";
    }
}

 

Нам осталось запустить наше приложение. Для этого, переопределим метод OnStartup(StartupEventArgs e) в App.xaml.cs:

protected override void OnStartup(StartupEventArgs e)
{
    ViewModel view = new ViewModel();
    MainWindow win = new MainWindow();
    win.DataContext = view;
    win.ShowDialog();
}

Результат можно увидеть на рисунке:

 

 

[download id=”17″]

One comment

Leave a Reply

Your email address will not be published. Required fields are marked *

http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_good.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif