Наконец, реализуйте переопределенные версии CanExecute
Execute. Метод CanExecute возвращает true, если Func равно null, а иначе выполняет Func и возвращает true. Метод Execute выполняет параметр типа Action.public override bool CanExecute(object parameter)
=> _canExecute == null || _canExecute((T)parameter);
public override void Execute(object parameter)
{ _execute((T)parameter); }
Изменение файла MainWindow.xaml.cs
Когда используются объекты RelayCommand
Добавьте новую закрытую переменную типа RelayCommand
DeleteCarCmd;private RelayCommand
public RelayCommand
=> _deleteCarCommand ??=
new RelayCommand
Также потребуется создать методы DeleteCar
CanDeleteCar:private bool CanDeleteCar(Car car) => car != null;
private void DeleteCar(Car car)
{
_cars.Remove(car);
}
Обратите внимание на строгую типизацию в методах — одно из преимуществ применения RelayCommand
Добавление и реализация кнопки удаления записи об автомобиле
Последним шагом будет добавление кнопки Delete Car
(Удалить автомобиль) и установка привязокCommand и CommandParameter. Добавьте следующую разметку: Command="{Binding Path=DeleteCarCmd,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"/>
Теперь, запустив приложение, вы можете удостовериться в том, что кнопка Delete Car
доступна, только если в раскрывающемся списке выбран автомобиль, и щелчок на ней приводит к удалению записи об автомобиле.Итоговые сведения о командах
На этом краткий экскурс в команды WPF завершен. За счет перемещения кода обработки событий из файла отделенного кода в индивидуальные классы команд появляются преимущества инкапсуляции, многократного использования и улучшенной возможности сопровождения. Если настолько большое разделение обязанностей не требуется, тогда можно применять легковесную реализацию RelayCommand
Перенос кода и данных в модель представления
Как и в разделе "Проверка достоверности WPF", вы можете продолжить работу с тем же самым проектом или создать новый и скопировать в него весь код. Вы создадите новый проект по имени WpfViewModel
Создайте в проекте новую папку под названием ViewModels
MainWindowViewModel.cs. Добавьте операторы using для следующих пространств имен и сделайте класс открытым:using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Input;
using WpfViewModel.Cmds;
using WpfViewModel.Models;
На заметку!
Популярное соглашение предусматривает именование моделей представлений в соответствие с окном, которое их поддерживает. Обычно имеет смысл следовать такому соглашению, поэтому оно соблюдается в настоящей главе. Тем не менее, как и любой паттерн или соглашение, это не норма, и на данный счет вы найдете широкий спектр мнений.Перенос кода MainWindow.xaml.cs
В модель представления будет перемещен почти весь код из файла отделенного кода. В конце останется только несколько строк, включая вызов метода InitializeComponent
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT