更改我正在收听的对象时是否需要删除事件侦听器?

时间:2016-05-11 14:31:51

标签: c# wpf

我的WPF ViewModels中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如Fullname = FirstName + SecondName)。

以前,我刚刚这样做了:

    public KPIViewModel KPIViewModel
    {
        get { return kpiViewModel; }
        set
        {
            if (kpiViewModel != value)
            {
                kpiViewModel = value;
                if (kpiViewModel != null)
                {
                    kpiViewModel.PropertyChanged += KpiViewModel_PropertyChanged;
                }
                NotifyOfPropertyChange(() => KPIViewModel);
            }
        }
    }

但是,如果我改变KPIViewModel对象,大概是KpiViewModel_PropertyChanged会挂起来吗?我应该这样做:

    public KPIViewModel KPIViewModel
    {
        get { return kpiViewModel; }
        set
        {
            if (kpiViewModel != value)
            {
                if (kpiViewModel != null)
                {
                    kpiViewModel.PropertyChanged -= KpiViewModel_PropertyChanged;
                }
                kpiViewModel = value;
                if (kpiViewModel != null)
                {
                    kpiViewModel.PropertyChanged += KpiViewModel_PropertyChanged;
                }
                NotifyOfPropertyChange(() => KPIViewModel);
            }
        }
    }

在将新的KpiViewModel_PropertyChanged添加到新对象之前删除现有的KpiViewModel_PropertyChanged?

编辑:为了回应“你应该把它放在实际的KPIViewModel类中的属性的setter中”,如果我理解它,你认为我应该这样做:

说,我有一个非常简单的情况,一个布尔值表示是否应该在屏幕上显示viewModel,我有几个不同的视图显示它,也许我也想对它执行一些其他随机动作更新,我最终得到这样的东西:

    private bool show;
    public bool Show
    {
        get { return show; }
        set
        {
            if (show != value)
            {
                show = value;
                if (MySummaryPageViewModel != null)
                {
                    MySummaryPageViewModel.UpdateFilter();
                }
                if (MyPickedDialogViewModel != null)
                {
                    MyPickedDialogViewModel.UpdateFilter();
                }
                if (MyPerformSomeOtherRandomActionViewModel != null)
                {
                    MyPerformSomeOtherRandomActionViewModel.DoThatThing();
                }
                NotifyOfPropertyChange(() => Show);
            }
        }

当然这不合情理。 KPI ViewModel肯定不会与所有这些其他对象逻辑有关。首先,对我来说似乎很难维护,并且KPI将不得不保留所有这些内容的引用,只是为了通知他们属性的变化。

这不正是INotifyPropertyChange接口存在的原因吗?

1 个答案:

答案 0 :(得分:0)

在我看来,实现类似功能的最简洁方法是不在包含ViewModel中处理kpiViewModel PropertyChanged事件。为什么不处理PropertyChanged本身的KPIViewModel(正如您通常所期望的那样)。如果KPIViewModel需要访问容器ViewModel上的成员,那么只需在KPIViewModel上设置一个属性ViewPodel(上面的Property方法中 this