Методы калибровки Caliburn Micro Guard, не оценивающие изменение свойств
Я играю с картой Caliburn Micro MVVM, и у меня есть некоторые проблемы с защитными методами.
У меня есть модель представления:
public class MyViewModel : PropertyChangedBase, IMyViewModel
Свойство:
public DateTime? Date
{
get{return this.date; }
set
{
this.date = value;
this.NotifyOfPropertyChange(() => Date);
}
}
Кроме того, у меня есть метод в моей модели с защитным методом
public void Calculate()
{
// ..some code..
}
public bool CanCalculate()
{
return this.Date.HasValue;
}
И кнопка на мой взгляд:
Проблема, с которой я сталкиваюсь, заключается в том, что метод CanCalculate выполняется при загрузке, но когда я ввожу значения в текстовые поля, он не переоценивает метод CanCalculate. Я запускаю событие с измененным свойством при настройке свойств модели представления данных базы данных, и что может быть проблемой?
Ответы
Ответ 1
Хорошо, я понял это. Я не понимал, что вам нужно запустить уведомление о методе защиты, подумал, что инфраструктура сделала это, но это имеет смысл.
Итак, я меняю свой набор свойств на:
public DateTime? Date
{
get
{
return this.date;
}
set
{
this.date = value;
this.NotifyOfPropertyChange(() => Date);
this.NotifyOfPropertyChange(() => CanCalculate);
}
}
и изменил мой метод CanCalculate
на свойство:
public bool CanCalculate
{
get
{
return this.Date.HasValue;
}
}
И теперь все отлично работает:)
Ответ 2
Если вам не нужен метод CanExecute, потому что вы не будете использовать параметры. Затем вы можете переписать его как свойство со стандартным уведомлением и только getter. И назовите его PropertyChanged, когда вы получите результат сгенерированного getter.
Ответ 3
Я предполагаю, что они вызываются через Command
(некоторый код вокруг того, что вызовет эти методы, поможет).
Если случай, который у вас есть, заключается в том, что вы хотите, чтобы команды отображались на основе какого-либо ввода, вам нужно вызвать CommandManager.InvalidateRequerySuggested()
, чтобы команды вызывались CanExecute
. Поскольку команда привязана к кнопке, а не к текстовому полю, она не будет обновляться. В свой установщик свойств (тот, который связан с текстовым полем) вы должны сообщить фреймворку о необходимости выполнять команды. Это, в свою очередь, вызовет ваш метод CanCalculate
.
Если методы Calculate и CanCalculate не связаны с командой, это не поможет.