C#Icommand语法
我正在学习C#,我刚刚遇到了一些事件,我正在阅读以下代码:C#Icommand语法,c#,wpf,icommand,C#,Wpf,Icommand,我正在学习C#,我刚刚遇到了一些事件,我正在阅读以下代码: class ACommand : ICommand { public ACommand() { Model.Duck.Weight.PropertyChanged += (sender, args) => { if (CanExecuteChanged != null) { CanExecuteChang
class ACommand : ICommand
{
public ACommand()
{
Model.Duck.Weight.PropertyChanged += (sender, args) =>
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, new EventArgs());
}
};
}
public bool CanExecute(object parameter)
{
//some code
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
//some code
}
}
我了解其中的大部分,但我真正不明白的是:
Model.Duck.Weight.PropertyChanged += (sender, args) =>
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, new EventArgs());
}
};
PropertyChanged是由Model.Duck.Weight触发的事件的名称。 With+=您正在向事件添加接收器。您可以在此处添加现有函数,就像Windows窗体所做的那样:
Button1.Click += this.Button1_Click;
与
但在您的情况下,不提供具体的函数,而是将匿名函数作为处理程序添加到PropertyChanged事件:
(sender, args) => { //do something }
在函数内部(my//do something所在的位置),您可以触发自己的事件CanExecuteChanged。检查null可确保其他人已向您的事件添加了事件处理程序,如果是,您可以直接触发它
PS:取消订阅的工作方式正好相反:
PropertyChanged -= <the function handling the event>
PropertyChanged-=
CanExecuteChanged
方法,以便绑定到此命令的控件将重新评估该命令是否可以执行
CanExecuteChanged
时,不是鸭子收到通知,而是绑定到该命令的控件
如果
Model.Duck
可以更改,是的,您应该取消旧的订阅并订阅新的。但是我没有您的代码的任何上下文,所以我不知道Model.Duck
到底是什么。它看起来像示例代码,而不是真实世界的代码。您提供的示例代码灼伤了我的眼睛
我不会直接回答你的问题,因为在这篇文章中其他人已经回答了这些问题。不过,我会提供一些建议
首先:
Model.Duck.Weight.PropertyChanged += (sender, args) =>
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, new EventArgs());
}
};
不,不,不,不,不
请记住,MVVM设计模式是关于保持事物解耦的,您的命令永远不应该,永远不需要订阅模型上的属性更改事件,我真的想不出任何需要这样做的场景
显然,订阅PropertyChanged
事件背后的原因是您需要刷新到CanExecuteChanged
的绑定。这是有道理的,但是,有一种更好的方法
替换此项:
public event EventHandler CanExecuteChanged;
为此:
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
“这到底是什么?”我听到你问了。在某些UI条件下,这有效地刷新了
CanExecuteChanged
。因此,如果调用了模型的PropertyChanged
,那么魔术就会发生,应用程序将计算出哪些命令需要刷新。你必须对此进行进一步研究以了解更多信息。本质上,这允许您可以通过订阅PropertyChanged
事件来删除我前面提到的废话。但是如果代码中不再引用旧Duck,并且该命令仍然在旧Duck的PropertyChanged事件上注册,那么它不会被垃圾收集,所以不需要取消订阅吗?@Bosiwow,不,如果有人是订阅Duck事件后,Duck会保留对订阅者的引用,而不是相反。因此,它不会阻止Duck的垃圾收集行:CanExecuteChanged(此,new EventArgs());,这到底是做什么的?它是否首先执行:CanExecute()然后通知所有正在侦听命令的人?行CanExecuteChange(这是新的EventArgs());将引发事件。正在侦听的每个事件处理程序现在都将被调用。如果您知道VB.net,它等于RaiseEventn不抱歉,我不知道VB.net;但是CanExecute()是什么时候调用?所有侦听器都调用这个吗?在你发布的代码段中:从不。如果你进入该函数,它必须在其他地方调用。当我在WPF:中执行类似操作时,它将在CanExecuteChanged事件上注册,如果我是对的,谢谢你的帖子,我将进一步研究。
public event EventHandler CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}