【问题标题】:Caliburn Micro Guard Methods not evaluating on property changeCaliburn Micro Guard 方法未评估属性变化
【发布时间】:2011-07-29 15:05:05
【问题描述】:

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

【问题讨论】:

  • 您能否显示视图的代码,以及您在视图模型中调用 NotifyOfPropertyChanged 方法的位置?

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

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

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

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

【讨论】:

  • Caliburn Micro 似乎忽略了 CommandManager.InvalidateRequerySuggested(),实际上有点疏忽。 ://
  • 这不是疏忽。 Caliburn.Micro 根本不使用Commands - 它有Actions/ActionMessages
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    好的,我想通了。我没有意识到你必须触发保护方法通知,以为框架会这样做,但这是有道理的。

    所以我将我的属性设置器更改为:

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

    现在一切正常:)

    【讨论】:

    • 只需将其转换为带有 getter 的布尔属性即可。
    • 对于任何遇到此尝试使其适用于带参数的保护方法的人:如果参数对象包含在另一个属性中(例如,集合绑定到列表框并且保护是 per-项目)您可以只通知(看似)不相关的属性更改的属性。
    猜你喜欢
    • 2011-09-30
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多