首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Caliburn Micro Guard方法不对属性更改进行计算

Caliburn Micro Guard方法不对属性更改进行计算
EN

Stack Overflow用户
提问于 2011-04-05 10:33:38
回答 3查看 6.4K关注 0票数 18

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

我有一个视图模型:

代码语言:javascript
复制
public class MyViewModel : PropertyChangedBase, IMyViewModel

A属性:

代码语言:javascript
复制
public DateTime? Date
{
   get{return this.date; }
   set
   {
      this.date = value;
      this.NotifyOfPropertyChange(() => Date);
   }
}

另外,我的视图模型中有一个带有guard方法的方法

代码语言:javascript
复制
public void Calculate()
{
    // ..some code..
}

public bool CanCalculate()
{
    return this.Date.HasValue;
}

在我的视图中有一个按钮:

我遇到的问题是,加载时会执行CanCalculate方法,但是当我在文本字段中输入值时,它不会重新计算CanCalculate方法。我在设置数据绑定视图模型属性时触发了属性更改事件,那么会有什么问题呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-06 01:01:26

好了,我想通了。我没有意识到你必须触发guard方法通知,虽然框架做到了这一点,但它是有意义的。

因此,我将我的属性setter更改为:

代码语言:javascript
复制
public DateTime? Date
{
   get
   {
      return this.date; 
   }
   set
   {
      this.date = value;
      this.NotifyOfPropertyChange(() => Date);
      this.NotifyOfPropertyChange(() => CanCalculate);
   }
}

并将我的CanCalculate方法更改为一个属性:

代码语言:javascript
复制
public bool CanCalculate
{
    get
    {
        return this.Date.HasValue;
    }
}

现在一切都正常了:)

票数 34
EN

Stack Overflow用户

发布于 2011-04-05 13:16:35

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-05 10:39:25

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

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

如果Calculate和CanCalculate方法没有与命令相关联,则上面的方法将不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5546568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档