Как сообщать команде, что пора выполнить CanExecute? с# WPF MVVM

201
20 октября 2018, 12:50

Недавно начал изучать MVVM и пока от него больше проблем. А то что называют слабой связанностью - для меня скорее "Слабо отслеживаемое поведение". Использую Prism.wpf. Создал DelegateCommand. В CanExecute указал bool переменную модели. При каждом изменение переменной вызываю RaisePropertyChanged(). Но кнопка на которой висит команда не реагирует на изменения. Что еще следует указывать, что бы СanExecute вызывался при каждом изменение переменой модели?

Answer 1

DelegateCommand в качестве CanExecute принимает функцию, которая проверяет некоторое условие и возвращает bool-значение, показывающее, может ли команда выполниться в данный момент. Вот простой пример:

string text;
public string Text
{
    get => text;
    set
    {
        if (Set(ref text, value))
            OK.RaiseCanExecuteChanged();
    }
}
public DelegateCommand OK { get; }
public MainVm()
{
    OK = new DelegateCommand(_ => MessageBox.Show(Text),
                             _ => !string.IsNullOrEmpty(Text));
}

я не использую Prism, поэтому мои реализации могут отличаться, но принцип вы должны понять

Т.е. при каждом изменении Text мы говорим команде проверить возможность запуска, команда вызывает метод, который у нее есть: _ => !string.IsNullOrEmpty(Text) и получает от него результат.

В итоге:

<StackPanel>
    <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
    <Button Content="OK" Command="{Binding OK}"/>
</StackPanel>

READ ALSO
Почему ошибка в тернарном операторе C#?

Почему ошибка в тернарном операторе C#?

Следующая ошибка появляется при копилляции кода:

190
Организации &ldquo;архитектуры&rdquo; приложения WPF

Организации “архитектуры” приложения WPF

Имеется приложение WPF которое выполняет нехитрые манипуляции, далее возникла необходимость например работы с данными из сторонних источников...

144
Актуальность Unit Of Work и Репозиториев в ASP.NET Core 2

Актуальность Unit Of Work и Репозиториев в ASP.NET Core 2

Раньше, наNET Framework MVC 5, я использовал трёхуровневую архитектуру вместе с паттернами Unit Of Work и Репозиторием

172
Работа с хуком на мышь

Работа с хуком на мышь

Работаю с хуком SetWindowsHookEx на мышь WH_MOUSE_LL

163