'PropertyChanged'事件是否使视图在使用它的模型的生命周期中保持活动状态?

时间:2010-12-10 19:50:18

标签: wpf binding inotifypropertychanged

'PropertyChanged'事件是否会在使用它的模型的生命周期中使视图保持活动状态?

例如,此代码是否在视图模型的生命周期内保持视图活动?

    public MyView(MyViewModel a_viewModel)
    {
        Loaded += (s, e) =>
            {
                DataContext = a_viewModel;
            };
    }

好的,不好的例子。以下是我在ViewModelBase课程中实际担心的代码:

protected void RelayPropertyChanges(INotifyPropertyChanged a_source, String a_strSourceProperty, String a_strTargetProperty)
{
    ValidatePropertyExists(a_strTargetProperty);

    if (a_source is ViewModelBase)
       (a_source as ViewModelBase).ValidatePropertyExists(a_strSourceProperty);

    a_source.PropertyChanged += (s, e) => OnPropertyChanged(a_strTargetProperty);
}

并且,我刚刚意识到这不会正常工作。我会回复你们这些人;关于如何使这项工作的任何想法?

1 个答案:

答案 0 :(得分:2)

“PropertyChanged”事件与任何其他事件没有什么不同,所以让我们一般性地讨论事件。

当您的视图实例(我们称之为V)订阅模型上的事件(M)时,它会将自己的引用交给代理中的模型。因此,M现在拥有对V的引用。如果您继续在其他代码中使用M,那么 - 该引用将使V的实例不被垃圾回收。

您可以通过“取消订阅”视图中的事件来消除此问题,或者确保您的模型不会过长时间(在这种情况下,它可能不是问题)。还有其他方法,人们使用“弱事件” - 但这需要对您的设计进行一些修改,而不是“嵌入”框架或语言(参见http://kutruff.wordpress.com/2009/03/06/high-performance-property-changed-weak-event-notifications-for-c/等文章)

由于您具体询问“PropertyChanged”,您可能会担心数据绑定(并且您已使用WPF标记)。在这种情况下,答案是“可能不是”。数据绑定管理器“智能”足以弱引用视图如果INotifyPropertyChanged继承或使用依赖项属性。如果没有,并且您没有使用OneTime绑定,则在您认为应该时不会收集该视图(有关详细信息,请参阅此KB http://support.microsoft.com/kb/938416