Caliburn Micro Guard Методы, не оценивающие изменение имущества - PullRequest
18 голосов
/ 05 апреля 2011

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

Ответы [ 3 ]

34 голосов
/ 05 апреля 2011

Хорошо, я понял это. Я не осознавал, что вы должны запустить уведомление метода защиты, думал, что это сделал фреймворк, но это имеет смысл.

Поэтому я изменяю свой установщик свойств на:

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 голосов
/ 05 апреля 2011

Если вам не нужен CanExecute, чтобы быть методом, потому что вы не будете использовать параметры. Затем вы можете переписать его как свойство со стандартным уведомлением и только получателем. И вызовите его PropertyChanged, когда вы получите результат изменения геттера.

0 голосов
/ 05 апреля 2011

Я предполагаю, что они вызываются с помощью Command (некоторый код, связанный с вызовом этих методов, поможет).

Если у вас есть случай, когда вы хотите, чтобы команды оценивали на основе некоторыхввод необходимо вызвать CommandManager.InvalidateRequerySuggested(), чтобы вызывать команды CanExecute s.Поскольку команда привязана к кнопке, а не к текстовому полю, она не будет обновляться.В вашем установщике свойств (привязанном к текстовому полю) вы должны указать платформе запросить команды.Это, в свою очередь, вызовет ваш метод CanCalculate.

Если методы Calculate и CanCalculate не связаны с какой-либо командой, описанное выше не поможет.

...