C# setter中传递的值上的绑定事件
使用值分配任务属性,并使用委托eventhandler绑定该值时。当一个新值经过时,是否为GarbageCollection选择了该值?根据我的理解,因为系统不再有对旧值的引用,所以它被标记为垃圾收集C# setter中传递的值上的绑定事件,c#,wpf,events,C#,Wpf,Events,使用值分配任务属性,并使用委托eventhandler绑定该值时。当一个新值经过时,是否为GarbageCollection选择了该值?根据我的理解,因为系统不再有对旧值的引用,所以它被标记为垃圾收集 private ITask _task; public ITask Task { get => _task; private set { if(_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();
}
}
}
根据,匿名事件处理程序不会阻止垃圾收集。但是,在分配新值之前读取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();
}
}
}