У меня есть метод расширения, который я использую для запуска уведомлений PropertyChanged, который выглядит примерно так:
public static TRet RaiseIfChanged<TObj, TRet>(this TObj target, Expression<Func<TObj, TRet>> property, TRet newValue)
where TObj : AlantaViewModelBase
{
var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
var propertyValue = propertyInfo.GetValue(target, null);
if (!EqualityComparer<TRet>.Default.Equals((TRet)propertyValue, (TRet)newValue))
{
// Marshal this to the dispatcher so that the RaisePropertyChanged() notification happens after
// the value is actually set.
Deployment.Current.Dispatcher.BeginInvoke(() => target.RaisePropertyChanged(propertyInfo.Name));
}
return newValue;
}
Он используется так:
private bool isBusy;
public bool IsBusy
{
get { return isBusy; }
set { isBusy = this.RaiseIfChanged(p => p.IsBusy, value); }
}
Мой вопросо Dispatcher.BeginInvoke()
, который я использую для фактического вызова target.RaisePropertyChanged()
.Учитывая, что свойство фактически не изменится, пока не завершится метод расширения, я должен быть уверен, что событие на самом деле не будет инициировано до тех пор, пока не будет установлено значение свойства.Могу ли я быть уверен, что так будет всегда?Или есть случаи, когда событие будет запущено за до того, как свойство будет изменено?Или есть лучший способ справиться с этим?