Текстовое поле не обновляет CanExecute - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над приложением MVVM, в котором есть кнопка Сохранить, которую я хотел бы отключить, если поле Заголовок пусто.

Вот код для команды делегата:

        _clickSaveChangesCommand = new DelegateCommand<string>(
            (s) => { saveStudentRecord(); //execute },
            (s) => { return (_student.Title != null);  /*Can execute*/ }
            );

Вот привязка:

 <TextBox Name="fldTitle" Text="{Binding Path=Student.Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="300" Height="27" />

Когда я обновляю объект ученика из модели представления, он работает как положено. Однако, если я создаю новую запись и что-то вписываю в текстовое поле, кнопка остается неисполняемой. В моем тестировании, если я пытаюсь показать значение _student.Title, оно показывается с ожидаемым значением.

1 Ответ

1 голос
/ 24 мая 2019

Вам нужно что-то сделать, чтобы вызвать событие CanExecuteChanged команды при изменении _student.Title.

Используете ли вы Prism DelegateCommand?Если так, Энди нашел этот ответ .Если поддерживается, это может быть предпочтительнее, чем предложение ниже.Но см. Этот вопрос , что похоже на ваш случай, когда свойство является свойством внука, а не прямым свойством класса, которому принадлежит команда.

Если вы используете Prism и можете это сделать, попробуйте заменить Student, чтобы увидеть, что произойдет.В 2016 году это сломало бы команду enable update.Это может все еще.

Так что, если это не сработает, это должно быть.

Ваш класс DelegateCommand<T> может иметь метод, который делает это;его часто называют RaiseCanExecuteChanged() или что-то в этом роде.

Вероятно, лучший способ сделать это в установщике для Student:

public Student Student
{
    get { return _student; }
    set
    {
        if (value != _student)
        {
            if (_student != null)
            {
                //  You do want to unhook this, otherwise there's a live reference 
                //  to the old _student and it won't be free to be garbage collected. 
                _student.PropertyChanged -= _student_PropertyChanged;
            }

            _student = value;

            if (_student != null)
            {
                _student.PropertyChanged += _student_PropertyChanged;
            }

            OnPropertyChanged();
        }
    }
}

private void _student_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Title")
    {
        ClickSaveChangesCommand.RaiseCanExecuteChanged();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...