Странное поведение onCanExecute RelayCommand MVVMLight 5+ - PullRequest
0 голосов
/ 02 июля 2018

Я перевожу инструмент из MVVM Light 4.0.3 в 5.4.1 и обнаружил очень странную проблему с новейшей реализацией RelayCommand .

Это старая реализация в V4.0.3 :

img1

img2

Это новейшая реализация в V5.4.1 :

img4

img3

Прежде чем я смог использовать переменные для определения поведения canExecute (включил кнопку) со следующим кодом:

public ICommand GetNewItemsFromDB { get; private set; }

private bool _IsActive;
public bool IsActive
{
    get
    {
        return _IsActive;
    }
    set
    {
        if (_IsActive != value)
        {
            _IsActive = value;
            this.RaisePropertyChanged(() => IsActive);
        }
    }
}

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => { return IsActive == false; });

private void GetDataFromDB()
{
    IsActive = true;
}

Предыдущий код мог без проблем включить кнопку в MVVM Light 4.0.3; однако в новейшей реализации всегда отключено, я добавил немного измененный, поскольку есть новое определение keepTargetAlive :

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => { return IsActive == false; }, true);

Кроме того, я попробовал вариант false , но ничего не изменилось. Единственный способ, который я нашел, чтобы снова включить его, это установить предварительно определенное значение, например:

GetNewItemsFromDB = new RelayCommand(GetDataFromDB, () => true, true);

Эта реализация будет бесполезной в моем случае, поскольку RelayCommand зависит от переменной IsActive , которая определяет, включена она или нет. Кто-нибудь, что я должен изменить в V5 , чтобы он работал? Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 02 июля 2018

Если я правильно понимаю.

Если вы используете этот класс в WPF4.5 или выше, вам нужно использовать GalaSoft.MvvmLight.CommandWpf пространство имен (вместо GalaSoft.MvvmLight.Command). Это позволит (или восстановить) Класс CommandManager, который обрабатывает автоматическое включение / отключение элементы управления на основе делегата CanExecute.

А в примечаниях к выпуску:

Важное замечание о проблеме 7659 : чтобы устранить проблему, при которой элементы управления больше не отключаются в зависимости от состояния RelayCommand.CanExecute делегат, вам нужно внести небольшое изменение в ваш код. Чтобы включить фиксированное поведение, измените пространство имен, которое вы используете от GalaSoft.MvvmLight.Command до GalaSoft.MvvmLight.CommandWpf.

Я правильно помню, где-то в древней истории мне приходилось делать это самостоятельно для проекта.

...