在当前的项目中,我面临以下情况:
一开始,我想到了钩接到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/