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

  • VM1用于在屏幕上显示。
  • VM1具有VM2的公共(public)属性。
  • VM1具有VM3的公共(public)属性。
  • 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.
        }
    }
    

    这意味着,由于无法在此类中解开该事件,因此发生了内存泄漏。

    因此,我最终将一个Action传递给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.WhenP1Changes的lambda捕获this VM1实例(需要访问VM3属性),因此只要 View 模型VM2处于 Activity 状态,它将使VM1处于 Activity 状态。是否最终导致泄漏取决于这些 View 模型的生命周期,但是其含义实际上与您使用事件的第一个示例相同。

    关于c# - 通过操作而不是钩PropertyChanged?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19932673/

    10-11 08:07