Поддерживает ли событие PropertyChanged представления в течение всей жизни моделей, которые его используют? - PullRequest
2 голосов
/ 10 декабря 2010

Поддерживает ли событие 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 Ответ

2 голосов
/ 10 декабря 2010

Событие «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, то представление не будет собрано, когда вы считаете, что это необходимо (дополнительную информацию см. В этом КБ http://support.microsoft.com/kb/938416)

...