【问题标题】:Does the 'PropertyChanged' event keep Views alive for the life of models that use it?'PropertyChanged' 事件是否让 View 在使用它的模型的生命周期内保持活跃?
【发布时间】:2010-12-10 19:50:18
【问题描述】:

“PropertyChanged”事件是否让 View 在使用它的模型的生命周期内保持活跃?

例如,这段代码是否不会在视图模型的生命周期内保持视图处于活动状态?

    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);
}

而且,我刚刚意识到这行不通。我会在这件事上回复你们;对如何实现这项工作有任何想法?

【问题讨论】:

  • 活着的意思是没有被GC'ed?
  • 是的(但“是的”是短评论。)

标签: wpf binding inotifypropertychanged


【解决方案1】:

“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 继承的视图 if 或使用依赖属性。如果没有,并且您没有使用OneTime 绑定,那么当您认为应该收集视图时,将不会收集该视图(有关更多信息,请参阅此知识库http://support.microsoft.com/kb/938416

【讨论】:

  • 我熟悉事件、订阅和很多。我关心的是委托(更具体地说是 lambda 表达式)。我正在尝试在我的视图模型中(在基类中)创建一个中继系统,以便对模型的更改可以自动中继到视图模型,然后再到视图。我使用的每个模型都使用 INotifyPropertyChanged 接口。我想知道我为执行中继而存储的 lambda 表达式是否会让模型保持视图活跃。我会将代码添加到我的问题中。
猜你喜欢
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多