Автоматически вызывать PropertyChanged при изменении свойства внутреннего объекта - PullRequest
7 голосов
/ 12 марта 2010

У меня есть такой сценарий

Class Parent 
{
    Property  A;
 }

 Class A 
 {
      Property X
 }

Как я могу получить PropertyChangedNotification на Свойство A при изменении X? Я не хочу ссылаться на «Родителя» в классе А или на любое другое мероприятие, которое портит мое разделение. Что я в основном хочу, чтобы сделать Parent.IsDirty==true. Это очень упрощенная версия моей истории, я получил десятки классов, таких как Parent, поэтому я ищу какой-то общий способ справиться с этим.

Обратите внимание, что это не фактический код. Я получил все INotifyPropertyChanged реализации. Мне просто интересно любой простой механизм, как RaisePropertyChanged("A.X")

Ответы [ 2 ]

8 голосов
/ 12 марта 2010

Вы можете попытаться зарегистрировать событие propertyaged в родительском классе. В конструкторе вы можете подписаться на событие:

public Parent()
{
    A.OnPropertyChanged += OnAPropertyChanged;
}

void OnAPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "X")
        if(PropertyChanged != null)
             PropertyChanged(this, new PropertyChangedEventArgs("A"))
}

надеюсь, это поможет ...

0 голосов
/ 13 мая 2013

Я не знаю, является ли это лучшей практикой, но: что-то вроде этого:

private Movie movie;
public Movie Movie
{
    get { return movie; }
    set
    {
        var oldProperties = typeof(Movie).GetProperties();
        foreach (var property in oldProperties)
        {
            if (property.GetValue(movie).GetHashCode() != value.GetType().GetProperty(property.Name).GetValue(value).GetHashCode())
            {
                RaisePropertyChanged(property.Name);
            }
        }

        movie = value;

    }
}

несомненно, вы можете вынести его на улицу к внешнему помощнику, который заберет 2 объекта и обработчик событий

...