Подтвердить что ты не робот

Методы калибровки 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. Я запускаю событие с измененным свойством при настройке свойств модели представления данных базы данных, и что может быть проблемой?

4b9b3361

Ответ 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 не связаны с командой, это не поможет.