Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Icommand语法_C#_Wpf_Icommand - Fatal编程技术网

C#Icommand语法

C#Icommand语法,c#,wpf,icommand,C#,Wpf,Icommand,我正在学习C#,我刚刚遇到了一些事件,我正在阅读以下代码: class ACommand : ICommand { public ACommand() { Model.Duck.Weight.PropertyChanged += (sender, args) => { if (CanExecuteChanged != null) { CanExecuteChang

我正在学习C#,我刚刚遇到了一些事件,我正在阅读以下代码:

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());
    }
};
  • 这段代码是否只是告诉程序,每当bucks wieght发生变化时,它都应该执行CanExecute methode,并警告所有受此命令约束的人
  • 另外,当鸭子改变时,我是否应该取消订阅旧鸭子,然后订阅新鸭子?因为如果我不退订,只向新的duck添加订阅,旧的duck在发生变化时仍然会收到通知,还是我错了?(有谁能告诉我,当模特改变时,我是如何从老鸭子那里退订的?谢谢

  • 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-=
    
  • 这段代码是否只是告诉程序,每当bucks wieght发生变化时,它都应该执行CanExecute methode,并警告所有受此命令约束的人
  • 是;它触发
    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;
            }
        }