Событие для «попыток» изменения свойства - PullRequest
0 голосов
/ 17 октября 2011

(с использованием .Net 3.5) У меня есть подпрограмма, которая импортирует настройки из внешнего источника данных, после чего мне нужно отобразить псевдожурнал для пользователя, подробно описывающий, какие свойства были обновлены.Обычно я отслеживаю обновления свойств через события property_changed.Однако когда значение из источника данных оказывается уже равным значению свойства, событие property_changed никогда не возникает, даже если был вызван набор свойств.Но мне все еще нужно отображать такие свойства для пользователя как «обновленные» из источника данных.

Какова общая схема здесь?Нужно ли мне другое событие (в дополнение к property_changed) в моём наборе свойств - "property_attemptedset"?

Edit: Так что одно из предположений состоит в том, что я просто не делаю проверку на равенство в установщике свойств, так что «property_changed» запускается несмотря ни на что.Но мне всегда говорили фильтровать по фактическим изменениям стоимости.Разве это не лучшая практика?

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Что ж, довольно часто избегают вызывать событие PropertyChanged , когда вы фактически не изменяете значение свойства ... но нет правила, которое говорит, что вы должны это делать. Просто удалите любую логику в установщике, которая сравнивает новое значение с текущим значением.

1 голос
/ 17 октября 2011

Похоже, ваш следующий шаг, основанный на том, что вы написали, состоит в том, чтобы иногда предотвратить изменение.Если это так, я бы представил новое событие, такое как BeforePropertySet, и передал бы объект события, который позволяет отменять.

Это соответствует передовым методам (предотвращая случайность, когда кто-нибудь когда-нибудь приходит, чтобы использовать свойство, изменило традиционный способ ине может понять, почему их код не работает), разъясняет, что вы делаете, и позволяет вам лучше разделять проблемы.

1 голос
/ 17 октября 2011

если вы напишите свои свойства следующим образом:

public string LastName{
    get { return lastName; }
    set {
        lastName = value;
        RaisePropertyChanged("LastName");
    }
}

Он всегда должен запускать событие PropertyChanged, даже если значение одинаково.Вам не нужно запускать какие-либо дополнительные события для этого.

РЕДАКТИРОВАТЬ

в дополнение к вашему редактированию: Да, рекомендуется проверять фактическое значениеизменения, но если ваш сценарий должен отслеживать не значимые изменения, я не понимаю, почему вы не можете изменить его.«Лучшая практика» не означает «разбей это правило и иди в тюрьму», верно?
Но если у этих классов есть какие-либо другие наблюдатели, которые также полагаются на общее поведение PropertyChanged, вы можетевсегда расширяйте свойства и генерируйте другое (пользовательское) событие, как вы упомянули:

    public event PropertyChangedEventHandler AttemptedPropertyChanged;
    public void RaiseAttemptedPropertyChanged(string propName)
    {
        if (AttemptedPropertyChanged != null)
        {
            AttemptedPropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }


    public string LastName{
        get { return lastName; }
        set {                
            RaiseAttemptedPropertyChanged("LastName");
            if (lastName == value) return;
            lastName = value;
            RaisePropertyChanged("LastName");
        }
    }
...