C# Caliburn Micro-Guard方法不评估性能变化

C# Caliburn Micro-Guard方法不评估性能变化,c#,wpf,mvvm,caliburn.micro,C#,Wpf,Mvvm,Caliburn.micro,我一直在使用Caliburn Micro MVVM框架,在保护方法方面遇到了一些问题 我有一个视图模型: public class MyViewModel : PropertyChangedBase, IMyViewModel A财产: public DateTime? Date { get{return this.date; } set { this.date = value; this.NotifyOfPropertyChange(() =>

我一直在使用Caliburn Micro MVVM框架,在保护方法方面遇到了一些问题

我有一个视图模型:

public class MyViewModel : PropertyChangedBase, IMyViewModel
A财产:

public DateTime? Date
{
   get{return this.date; }
   set
   {
      this.date = value;
      this.NotifyOfPropertyChange(() => Date);
   }
}
public bool CanCalculate
{
    get
    {
        return this.Date.HasValue;
    }
}
此外,我在视图模型中有一个方法,其中包含一个保护方法

public void Calculate()
{
    // ..some code..
}

public bool CanCalculate()
{
    return this.Date.HasValue;
}
在我的视图中还有一个按钮:


我遇到的问题是,CanCalculate方法在加载时执行,但当我在文本字段中输入值时,它不会重新计算CanCalculate方法。我在设置数据绑定视图模型属性时触发property changed事件,因此可能会出现什么问题?

我假设这些属性是通过
命令调用的(关于这些方法的调用的一些代码会有所帮助)

如果您希望根据调用
CommandManager.invalidateRequestSuggested()
所需的某些输入重新计算命令,则会调用命令
CanExecute
s。由于命令绑定到按钮而不是文本框,因此它不会更新。在属性设置器(绑定到文本框的设置器)中,您必须告诉框架重新查询命令。这将依次调用
CanCalculate
方法


如果Calculate和CanCalculate方法未与命令关联,则上述方法将没有帮助。

如果您不需要CanExecute to be方法,因为您不会使用参数。然后,您可以使用标准通知和仅getter将其重写为属性。当你知道getter的结果改变时,调用它的属性changed。

好的,我知道了。我没有意识到你必须发出guard方法通知,虽然框架做到了,但这是有道理的

因此,我将属性设置器更改为:

public DateTime? Date
{
   get
   {
      return this.date; 
   }
   set
   {
      this.date = value;
      this.NotifyOfPropertyChange(() => Date);
      this.NotifyOfPropertyChange(() => CanCalculate);
   }
}
并将我的
CanCalculate
方法更改为属性:

public DateTime? Date
{
   get{return this.date; }
   set
   {
      this.date = value;
      this.NotifyOfPropertyChange(() => Date);
   }
}
public bool CanCalculate
{
    get
    {
        return this.Date.HasValue;
    }
}

现在一切都正常了:)

能否显示视图的代码,以及在视图模型中调用NotifyOfPropertyChanged方法的位置?只需使用getter将其转换为布尔属性即可。对于任何试图使其适用于带参数的guard方法的人:如果parameter对象包含在另一个属性中(例如,一个集合绑定到一个列表框,并且保护是每项的)您可以只通知(看似)不相关属性的属性已更改。Caliburn Micro似乎忽略CommandManager.InvalidateRequestSuggested(),实际上有点疏忽。:/这不是疏忽。Caliburn.Micro根本不使用
命令
-它有
操作
/
操作消息