Язык программирования C#9 и платформа .NET5
Часть 570 из 642 Информация о книге
}public void Execute(object parameter){throw new NotImplementedException();}public event EventHandler CanExecuteChanged;}Если метод
возвращаетCanExecute(), то привязанные элементы управления будут включенными, а еслиtrue, тогда они будут отключенными. Если элемент управления включен (falseвозвращаетCanExecute())и на нем совершается щелчок, то запустится методtrue. Параметры, передаваемые обоим методам, поступают из пользовательского интерфейса и основаны на свойствеExecute(), устанавливаемом в конструкциях привязки. СобытиеCommandParameterпредусмотрено в системе привязки и уведомлений для информирования пользовательского интерфейса о том, что результат, возвращаемый методомCanExecuteChanged, изменился (почти как событиеCanExecute()).PropertyChangedВ текущем примере кнопка Change Color должна работать, только если параметр отличается от
ипринадлежит типуnull. Модифицируйте методCarследующим образом:CanExecute()public bool CanExecute(object parameter)=> (parameter as Car) != null;Значение параметра для метода
будет таким же, как и для методаExecute(). Поскольку методCanExecute()может выполняться лишь в случае, еслиExecute()имеет типobject, аргумент потребуется привести к типуCarи затем обновить значение цвета:Carpublic void Execute(object parameter){((Car)parameter).Color="Pink";}Присоединение команды к CommandManager
Финальное обновление класса команды связано с присоединением команды к диспетчеру команд (
). МетодCommandManagerзапускается при загрузке окна в первый раз и затем в ситуации, когда диспетчер команд инструктирует его о необходимости перезапуска. Каждый класс команды должен быть присоединен к диспетчеру команд, для чего нужно модифицировать код, относящийся к событиюCanExecute():CanExecuteChangedpublic event EventHandler CanExecuteChanged{add => CommandManager.RequerySuggested += value;remove => CommandManager.RequerySuggested -= value;}Изменение файла MainWindow.xaml.cs
Следующее изменение связано с созданием экземпляра класса
, к которому может иметь доступ элемент управленияChangeColorCommand. В настоящий момент вы будете делать это в файле отделенного кода дляButton(позже в главе код переместится в модель представления). Откройте файлMainWindowи удалите обработчик событияMainWindow.xaml.csдля кнопки Change Color. Поместите в начало файла следующие операторыClick(пространство имен может варьироваться в зависимости от того, работаете вы с предыдущим проектом или начали новый):usingusing WpfCommands.Cmds;using System.Windows.Input;Добавьте открытое свойство по имени
типаChangeColorCmdс поддерживающим полем. В теле выражения для свойства возвратите значение поддерживающего поля (создавая экземплярICommand, если поддерживающее поле равноChangeColorCommand):nullprivate ICommand _changeColorCommand = null;public ICommand ChangeColorCmd=> _changeColorCommand ??= new ChangeColorCommand());Изменение файла MainWindow.xaml
Как было показано в главе 25, элементы управления WPF, реагирующие на щелчки (вроде
), имеют свойствоButton, которое позволяет назначать элементу управления объект команды. Для начала присоедините объект команды, созданный в файле отделенного кода, к кнопкеCommand. Поскольку свойство для команды находится в классеbtnChangeColor, с помощью синтаксиса привязкиMainWindowполучается окно, содержащее необходимую кнопку:RelativeSourceCommand="{Binding Path=ChangeColorCmd,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"Кнопка также нуждается в передаче объекта
в качестве параметра для методовCarиCanExecute(), что делается через свойствоExecute(). Установите свойствоCommandParameterдляPathв свойствоCommandParameterэлементаSelectedItemпо имениComboBox:cboCarsCommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"Вот завершенная разметка для кнопки:
<Button x:Name="btnChangeColor" Content="Change Color" Margin="5,0,5,0"