Caliburn.Micro可以动作语法和行为

时间:2017-09-11 14:13:18

标签: caliburn.micro

Caliburn.Micro可以使用参数调用Action绑定,但不能没有参数。我对Caliburn.Micro很新。任何人都可以解释这种行为吗?我已经完成了http://caliburnmicro.com/documentation/introduction

以下Xaml

<TextBox x:Name="YourName" />
<TextBox x:Name="Address" />
<Button x:Name="Save" />

这是有效的:

public void Save(string yourName, string address)
{
    MessageBox.Show( $"Your Name : {yourName}{Environment.NewLine}Address : {address}", "You have entered:", MessageBoxButton.OK);
}

public bool CanSave(string yourName, string address) => (!string.IsNullOrWhiteSpace(yourName) && !string.IsNullOrWhiteSpace(address));

这不起作用

public void Save()
    {
        MessageBox.Show( $"Your Name : {yourName}{Environment.NewLine}Address : {address}", "You have entered:", MessageBoxButton.OK);
    }

public bool CanSave() => (!string.IsNullOrWhiteSpace(yourName) && !string.IsNullOrWhiteSpace(address));

2 个答案:

答案 0 :(得分:2)

TL; DR:只需使用Can-property而不是Can-method,只要其中一个前置条件可能已更改,就引发PropertyChanged事件。

在Caliburn.Micro中实施行动警卫有两种方式

  

当找到“SayHello”消息的处理程序时,它将检查该类是否还有属性或名为“CanSayHello”的方法。如果你有一个guard属性,你的类实现了INotifyPropertyChanged,那么框架将观察该属性的变化并相应地重新评估防护。

           

All About Actions - Caliburn.Micro Documentation

使用方法作为警卫

这是你试过的。它适用于具有参数的Action方法,因为每当其中一个参数发生更改时,都会重新评估警卫。工作中没有魔法 - 实际上,它只是在幕后使用WPF数据绑定将Action实例绑定到参数值。一旦绑定引擎检测到更改,将调用guard方法。这就是为什么在没有参数的情况下它不会工作的原因,并且没有办法轻易自己触发警卫。

使用Properies作为警卫

这是你应该在你的情况下使用的:添加一个Get-only属性,就像这样:

public bool CanSave => (!string.IsNullOrWhiteSpace(yourName) 
                        && !string.IsNullOrWhiteSpace(address));

然后,只要yournameaddress发生变化,只需致电:

this.NotifyOfPropertyChange(nameof(CanSave));

这样,框架就会知道Guard的值可能已经改变并重新评估它。

答案 1 :(得分:0)

如果要调用带参数的方法,则应该这样做:

<Button cal:Message.Attach="[Event Click] = [Action Save(YourName.Name, Address.Name)]"/>

要启用/禁用“保存”按钮,您应该拥有属性YourName,Address和CanSave ...并在每次更改(YouName,Address)时更新属性(CanSave)。

NotifyOfPropertyChange(nameof(CanSave));

我希望对你有所帮助