Caliburn Micro Guard方法不评估财产变化

时间:2011-04-05 02:33:38

标签: c# wpf mvvm caliburn.micro

我一直在使用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 个答案:

答案 0 :(得分:34)

好的我明白了。我没有意识到你必须触发防护方法通知,认为框架是这样做的,但这是有道理的。

所以我将属性设置器更改为:

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;
    }
}

现在一切正常:)

答案 1 :(得分:2)

如果你不需要CanExecute作为方法,因为你不会使用参数。然后你可以用标准通知重写它作为属性,只有getter。当你改变getter的结果时调用它的PropertyChanged。

答案 2 :(得分:0)

我假设这些是通过Command调用的(有些代码围绕这些方法会有所帮助)。

如果您遇到的情况是您希望根据某些输入重新评估命令,则需要调用CommandManager.InvalidateRequerySuggested(),以便调用命令CanExecute。由于命令绑定到按钮而不是文本框,因此不会更新。在属性设置器(绑定到文本框的那个)中,您必须告诉框架重新查询命令。这反过来会调用您的CanCalculate方法。

如果Calculate和CanCalculate方法与命令无关,那么上述方法将无济于事。