C# 是否传递操作而不是挂起PropertyChanged?

C# 是否传递操作而不是挂起PropertyChanged?,c#,wpf,mvvm,action,propertychanged,C#,Wpf,Mvvm,Action,Propertychanged,在我当前的项目中,我面临以下情况: VM1用于在屏幕上显示 VM1具有VM2的公共属性 VM1具有VM3的公共属性 VM3有一个依赖于VM2的属性 VM1没有处理机制 一开始,我考虑挂接VM2.PropertyChanged事件,以检查我想要的属性,并相应地更改受VM3影响的属性,如下所示: public class VM1 : INotifyPropertyChanged { public property VM2 VM2 { get; private set; } pub

在我当前的项目中,我面临以下情况:

  • VM1用于在屏幕上显示
  • VM1具有VM2的公共属性
  • VM1具有VM3的公共属性
  • VM3有一个依赖于VM2的属性
  • VM1没有处理机制
一开始,我考虑挂接VM2.PropertyChanged事件,以检查我想要的属性,并相应地更改受VM3影响的属性,如下所示:

public class VM1 : INotifyPropertyChanged
{
    public property VM2 VM2 { get; private set; }
    public property VM3 VM3 { get; private set; }

    public VM1()
    {
        this.VM2 = new VM2();
        this.VM3 = new VM3();
        this.VM2.PropertyChanged += this.VM2_PropertyChanged;
    }

    private void VM2_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // if e.PropertyName equals bla then VM3.SomeProperty = lol.     
    }
}
这意味着,由于我不能在这个类中取消钩住事件,我有一个内存泄漏

因此,我将向VM2传递一个操作,以便在其重要属性更改值时调用它,如下所示:

public class VM2 : INotifyPropertyChanged
{
    public Action WhenP1Changes { get; set; }

    private bool _p1;
    public bool P1
    {
        get
        {
            return _p1;
        }
        set
        {
            _p1 = value;
            this.WhenP1Changes();
            this.PropertyChanged(this, new PropertChangedEventArgs("P1");
        }
    }
}

public class VM1 : INotifyPropertyChanged
{
    public VM2 VM2 { get; private set; }
    public VM3 VM3 { get; private set; }

    public VM1()
    {
        this.VM2 = new VM2();
        this.VM3 = new VM3();
        this.VM2.WhenP1Changes = () => VM3.SomeProperty = "lol";
    }
}
这里有内存泄漏吗?

PD:如果您还可以回答以下问题,那就太好了: -这是一个好的做法吗


谢谢

简言之,我更愿意使用
委托
在视图模型之间进行通知。如果您有一个可以访问各种子视图模型的父视图模型(看起来您有),那么您可以使用一个或多个类似于
委托的事件在需要更新时相互通知

与其再次输入整个场景,我更愿意向您指出我对这个问题的答案,它提供了此技术的完整描述和代码示例

在我对这个问题的回答中,还有一点可能会引起你们的兴趣。如果你有任何问题,请告诉我

我这里有内存泄漏吗


分配给
VM2的lambda。当np1change
捕获
VM1实例(需要访问
VM3
属性)时,只要视图模型
VM2
处于活动状态,它就会保持
VM1
处于活动状态。这是否最终成为泄漏取决于这些视图模型的生命周期,但其含义实际上与您使用事件的第一个示例相同。

“VM3有一个依赖于VM2的属性”=>听起来问题就从这里开始。问题中的一切都很抽象,但这听起来不对。难道你不能重构,使所有虚拟机只依赖于它们的模型吗?好吧,假设VM2.IsEnabled将修改VM3.IsVisible。我接受这种依赖性。基本上,您建议坚持使用基于事件的专门解决方案,在该解决方案中,您可以准确地通知发生了什么,而不是使用通用的“PorpertyChanged”事件,对吗?我倾向于使用
委托
s,因为我可以定义最适合当前情况的参数。但是,我不认为您当前的场景会给您带来内存泄漏,因为您的
VM2
VM3
对象似乎始终处于活动状态。只有当一个不再需要的对象通过对另一个对象的硬引用而保持活动状态时,才会发生内存泄漏。我非常反对直接使用委托。尽管动作或函数是委托,但我更清楚它们的用法,因为它们需要更少的代码。感谢对动作范围和生命周期的说明,这正是我想要的:)