Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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

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# 更改对象I';时是否需要删除事件侦听器;我在听什么?_C#_Wpf - Fatal编程技术网

C# 更改对象I';时是否需要删除事件侦听器;我在听什么?

C# 更改对象I';时是否需要删除事件侦听器;我在听什么?,c#,wpf,C#,Wpf,我的WPF视图模型中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如aFullname=FirstName+SecondName) 在此之前,我刚刚做了以下工作: public KPIViewModel KPIViewModel { get { return kpiViewModel; } set { if (kpiViewModel != value)

我的WPF视图模型中有一些“传递”属性,它们使用PropertyChange事件来更新相关属性(例如a
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_属性changed可能会挂起?我是否应该这样做:

    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_属性之前,是否删除已更改的现有KpiViewModel_属性

编辑:对于“您应该将其放入实际KPIViewModel类中属性的setter中”,如果我理解,您认为我应该这样做:

    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);
            }
        }
比如说,我有一个非常简单的例子,一个布尔值,表示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中处理kPriviewModel
PropertyChanged
事件。为什么不在
KPIViewModel
本身中处理
属性changed
(正如您通常期望的那样)。如果
KPIViewModel
需要访问容器ViewModel上的成员,那么只需在KPIViewModel上设置一个属性,即容器ViewModel(this,在上面的属性方法中)

旧的
KPIViewModel
,在这种情况下,我不认为它会很长,因为它通常是从视图的持久化模型生成的,使用后会被丢弃。但是我在其他情况下对模型做了类似的事情。如何创建属性
KPIViewModel
?如果每次创建
KPIViewModel
的新实例时,取消订阅
PropertyChanged
事件都是无用的,因为您使用的是对象的新实例。在这种情况下,此时KPIViewModel不是在构造函数中创建的,而是始终在创建时设置一次。我不能说这种情况是否总是会发生,尽管很可能会发生。为什么您需要订阅
kpiViewModel.PropertyChanged
?因为您可以只调用必要的方法(在您的事件处理程序中),而无需任何sunscribing。只需在
KPIViewModel
属性的setter中编写一个必要的方法。这对我来说似乎是一个糟糕的主意,我已经尝试在编辑中演示了如何操作(注释中的代码不好)。