这种MVVM方法会产生内存泄漏吗?

时间:2015-03-12 14:20:24

标签: c# mvvm memory-leaks inotifypropertychanged

我发现键入并重新键入相同的属性getter和setter会引发属性更改事件变得乏味且可能容易出错,因为属性名称作为类型化字符串传递。在搜索更简单的方法之后,我创建了以下泛型类:

public class ObservableProperty<T> : INotifyPropertyChanged
{
    private T _backingField;
    public T Value
    {
        get { return this._backingField; }
        set
        {
            if (!EqualityComparer<T>.Default.Equals(this._backingField, value))
            {
                this._backingField = value;
                this.TriggerPropertyChangedEvent();
            }
        }
    }

    /// <summary>
    /// Creates an observable property with a default initial value.
    /// </summary>
    public ObservableProperty() : this(default(T)) { }

    /// <summary>
    /// Creates an observable property with the specified initial value.
    /// </summary>
    /// <param name="initialValue">The value to initialize the observable property to.</param>
    public ObservableProperty(T initialValue)
    {
        this.Value = initialValue;
    }

    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;

    protected void TriggerPropertyChangedEvent([CallerMemberName]string propertyName = null)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion // INotifyPropertyChanged Implementation
}

现在,不是在整个ViewModel上实现INotifyPropertyChanged,而是直接输入所有支持字段和属性getter和setter,所有必须做的就是:

public ObservableProperty<string> BindableText { get; private set; }

然后在构造函数中:

this.BindableText = new ObservableProperty<string>("Default Text");

视图现在将绑定到XAML中的BindableText.Value。

因此每个属性都有自己的INotifyPropertyChanged实现,自己成为一个迷你视图模型,创建这些实例的模型和视图模型根本不需要实现该接口。

这很好用,可以绑定的属性很容易创建。 ViewModels甚至可以引用模型上的可观察属性,如:

public ObservableProperty<int> MyNumber { get { return MyModel.Number; } }

这样视图不会直接绑定到模型上的属性,只能通过它们的视图模型间接绑定。

我有这个问题,因为它不是我有很多经验的东西,是否会有任何潜在的软内存泄漏,采取这种方法我可以采取措施以某种方式?

1 个答案:

答案 0 :(得分:0)

  

通过采用这种方法可以防止任何潜在的软内存泄漏吗?

发生内存泄漏的风险与标准INotifyPropertyChange方法相同:

  1. 如果这些ObservableProperties用于XAML中的绑定,则没有内存泄漏,因为WPF使用Weak Events来绑定实现{{1}的对象的属性} interface。

  2. 如果在代码中使用INotifyPropertyChange订阅ObservableProperties事件,则可能是内存泄漏。

  3. 例如,如果INotifyPropertyChange订阅ViewModel INotifyPropertyChange这样的ObservableProperty对象的Model事件,那么在ViewModel之前不会对此Model进行垃圾回收{1}}是垃圾回收或ViewModel取消订阅。如果为一个ViewModels创建了许多Model,则此泄漏可能会很明显。