我一直在使用Caliburn Micro MVVM框架,在防护方法上遇到了一些问题。
我有一个视图模型:
public class MyViewModel : PropertyChangedBase, IMyViewModel
A属性:
public DateTime? Date
{
get{return this.date; }
set
{
this.date = value;
this.NotifyOfPropertyChange(() => Date);
}
}
另外,我的视图模型中有一个带有guard方法的方法
public void Calculate()
{
// ..some code..
}
public bool CanCalculate()
{
return this.Date.HasValue;
}
在我的视图中有一个按钮:
我遇到的问题是,加载时会执行CanCalculate方法,但是当我在文本字段中输入值时,它不会重新计算CanCalculate方法。我在设置数据绑定视图模型属性时触发了属性更改事件,那么会有什么问题呢?
发布于 2011-04-06 01:01:26
好了,我想通了。我没有意识到你必须触发guard方法通知,虽然框架做到了这一点,但它是有意义的。
因此,我将我的属性setter更改为:
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-05 13:16:35
如果你不需要CanExecute作为方法,因为你不会使用参数。然后,您可以将其重写为具有标准通知且仅具有getter的属性。并在假定getter更改的结果时调用它的PropertyChanged。
发布于 2011-04-05 10:39:25
我假设这些方法是通过Command
调用的(围绕这些方法的一些代码可能会有所帮助)。
如果您希望根据某些输入重新评估命令,则需要调用CommandManager.InvalidateRequerySuggested()
,这样命令CanExecute
就会被调用。由于命令被绑定到按钮而不是文本框,因此它不会更新。在你的属性setter (绑定到文本框的那个)中,你必须告诉框架重新查询命令。这反过来将调用您的CanCalculate
方法。
如果Calculate和CanCalculate方法没有与命令相关联,则上面的方法将不起作用。
https://stackoverflow.com/questions/5546568
复制相似问题