Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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# setter中传递的值上的绑定事件_C#_Wpf_Events - Fatal编程技术网

C# setter中传递的值上的绑定事件

C# setter中传递的值上的绑定事件,c#,wpf,events,C#,Wpf,Events,使用值分配任务属性,并使用委托eventhandler绑定该值时。当一个新值经过时,是否为GarbageCollection选择了该值?根据我的理解,因为系统不再有对旧值的引用,所以它被标记为垃圾收集 private ITask _task; public ITask Task { get => _task; private set { if(_task !=

使用值分配任务属性,并使用委托eventhandler绑定该值时。当一个新值经过时,是否为GarbageCollection选择了该值?根据我的理解,因为系统不再有对旧值的引用,所以它被标记为垃圾收集

  private ITask _task;

  public ITask Task
        {
            get => _task;
            private set
            {
                if(_task != value)
                {
                    if(value != null)
                        value.PropertyChanged += (s, e) =>
                            {
                                if(((ITask)s).Status == TaskStatus.Ready)
                                    RaisePropertyChanged(nameof(ButtonCommand));
                            };

                    _task = value;
                    RaisePropertyChanged();
                }
            }
        }


根据,匿名事件处理程序不会阻止垃圾收集。但是,在分配新值之前读取Task并仍保留结果的任何对象将保留对Task旧值的引用,从而防止垃圾收集。

您没有从事件处理程序取消订阅值,因此它将永远不会被收集,这意味着您的事件处理程序将被多次调用。您需要在使用-=之前取消订阅_task,这意味着您还需要对匿名函数的引用,如或使用处理程序生成一个方法
  private ITask _task;

  public ITask Task
        {
            get => _task;
            private set
            {
                if(_task != value)
                {
                    if(value != null)
                        value.PropertyChanged += (s, e) =>
                            {
                                if(((ITask)s).Status == TaskStatus.Ready)
                                    RaisePropertyChanged(nameof(ButtonCommand));
                            };

                    _task = value;
                    RaisePropertyChanged();
                }
            }
        }