18

我一直在使用 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 方法。我在设置数据绑定视图模型属性时触发了属性更改事件,那么可能是什么问题?

4

3 回答 3

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

现在一切正常:)

于 2011-04-05T17:01:25.980 回答
2

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

于 2011-04-05T05:16:35.343 回答
0

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

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

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

于 2011-04-05T02:39:24.540 回答