1

在我目前的项目中,我遇到了以下情况:

  • 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.     
    }
}

这意味着,由于我无法在此类中取消挂钩事件,因此存在内存泄漏。

所以我最终将一个 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:如果您还可以回答以下问题,那就太好了: - 这甚至是一个好习惯吗?

谢谢

4

2 回答 2

1

我这里有内存泄漏吗?

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

于 2013-11-12T15:29:36.073 回答
1

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

与其再次输入整个场景,我更愿意向您指出我对在视图模型之间传递参数问题的回答,该问题提供了该技术的完整描述和代码示例。

还有一个您可能感兴趣的补充内容,可以在我对“如有必要,如何从其他 ViewModels问题中调用 MainViewViewModel 中的函数”的回答中找到。请让我知道,如果你有任何问题。

于 2013-11-12T15:23:26.213 回答