我的WPF ViewModel中有一些“传递”属性,这些属性使用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类的属性的设置器中”,如果我理解它,您认为我应该做这样的事情:

说,我有一个非常简单的案例,一个布尔值,代表是否应该在屏幕上显示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接口的原因吗?

最佳答案

我认为,实现类似目的的最干净方法是不处理包含的ViewModel中的kpiViewModel PropertyChanged事件。为什么不处理PropertyChanged本身中的KPIViewModel(通常会如此)。如果KPIViewModel需要访问容器ViewModel上的成员,则只需在KPIViewModel上设置一个属性,即容器ViewModel(在上述Property方法中)

关于c# - 更改正在监听的对象时,是否需要删除事件监听器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37165777/

10-11 02:24