Каков предпочтительный способ реализации CanExecuteChanged? - PullRequest
0 голосов
/ 12 октября 2019

Вот код, с которым я работаю, единственное изменение, которое я там сделал, это добавление атрибута [CallerMemberName] в метод void Changed([CallerMemberName] string name = "") таким образом. Во вчерашней статье я читал, что вместо

    public event EventHandler CanExecuteChanged 
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

я мог бы заменить эту часть:

    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

на ; и добавить функцию для обработки CanExecuteChanged в Command классе, например:

    public void Evaluate() => CanExecuteChanged?.Invoke(null, EventArgs.Empty);

и вызовите метод Evaluate в свойствах setters FirstName и LastName класса Person. Я протестировал приложение с add/remove и Evaluate, и оба работают.

Что из этого будет более эффективным?

1 Ответ

1 голос
/ 12 октября 2019

В этом фрагменте кода

    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

RequirySuggested требуется событие для правильной работы CommandManager.InvalidateRequerySuggested метода Этот метод используется для аннулирования привязок команд и обновления CanExecute для всех команд. Вы сделали почти то же самое вручную, используя CanExecuteChanged?.Invoke(null, EventArgs.Empty); для своего Person класса. Но в некоторых случаях CommandManager.InvalidateRequerySuggested все еще необходим, например, когда вам нужно обновить привязку команды вне класса Person или из другого ViewModel.

Существует также ветка SO с различными мнениями относительно вашего вопроса.

...