MVVM, команда с параметрами

Когда Пользователь нажимает на кнопку в интерфейсе Программы, одним из способов передачи действия в логику — это использование команды.
Суть команды — это выполнение определённого действия, обычно таким действием является метод.
Привязка элемента управления (например, кнопки) к команде происходит обычно в Представлении (View)
Сама команда создаётся в Модели Представления (ViewModel)
Простая команда
Команда с параметром

а) «плохой способ»
Исходные данные:
— Элемент управления кнопка «CreateButton», расположенный на представлении MainView.xaml
— класс ViewModel’и MainViewModel:IMainViewModel, INotifyPropertyChanged
Также необходимо помнить, что в представлении, в котром находится кнопка CreateButton, ViewModel задаётся как DataContext.
В интерфейсе объявляем команду:
public interface IMainViewModel
{
...
ICommand ButtonReactionCommand{ get; }
}

В классе реализуем команду:
public class MainViewModel: IMainViewModel, INotifyPropertyChanged
{
private readonly DelegateCommand _createButtonCommand;
public MainViewModel
{
_createButtonCommand = new DelegateCommand(СreateButtonExecute);
}

#region CreateButtonCommand
public ICommand ButtonReactionCommand
{
get { return _createButtonCommand ; }
}
private void СreateButtonExecute(object param)
{
// более подробно по написанию команд с параметрами можно увидеть в проекте "WPFPrism4Navigation" из примеров руководства "Prism", в Представлении "ApplicationMenuView.xaml"

// ...do something and use object;
// for example if you param is a string object, you can do:
string temp = (string)param;
MessageBox.Show(temp);
}
#endregion
}

В code-behind Представления MainView.xaml.cs, на котором расположена кнопка, в конструкторе задаём DataContext:
public partial class MainView
{
public MainView()
{
InitializeComponent();
DataContext = new MainViewModel();
}
}

Привязываем кнопку к команде:

<UserControl>
<Button x:Name="CreateButton" Command="{Binding ButtonReactionCommand}"
CommandParameter="my string param"/>
</UserControl>

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.