C# Caliburn Micro-Guard方法不评估性能变化
我一直在使用Caliburn Micro MVVM框架,在保护方法方面遇到了一些问题 我有一个视图模型: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(() =>
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根本不使用命令
-它有操作
/操作消息
。