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));
答案 0 :(得分:2)
TL; DR:只需使用Can-property而不是Can-method,只要其中一个前置条件可能已更改,就引发PropertyChanged
事件。
在Caliburn.Micro中实施行动警卫有两种方式:
当找到“SayHello”消息的处理程序时,它将检查该类是否还有属性或名为“CanSayHello”的方法。如果你有一个guard属性,你的类实现了INotifyPropertyChanged,那么框架将观察该属性的变化并相应地重新评估防护。
这是你试过的。它适用于具有参数的Action方法,因为每当其中一个参数发生更改时,都会重新评估警卫。工作中没有魔法 - 实际上,它只是在幕后使用WPF数据绑定将Action实例绑定到参数值。一旦绑定引擎检测到更改,将调用guard方法。这就是为什么在没有参数的情况下它不会工作的原因,并且没有办法轻易自己触发警卫。
这是你应该在你的情况下使用的:添加一个Get-only属性,就像这样:
public bool CanSave => (!string.IsNullOrWhiteSpace(yourName)
&& !string.IsNullOrWhiteSpace(address));
然后,只要yourname
或address
发生变化,只需致电:
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));
我希望对你有所帮助