Если вы хотите чистый код:
не инициализировать приватную переменную _myText, но MyText в конструкторе
private readonly IEventAggregator _eventAggregator;
public BaseViewModel()
{
MyText = "Update Number at Here !";
_eventAggregator = IoC.Get<IEventAggregator>();
}
и лучше, если вы используете инъекцию зависимостей:
private readonly IEventAggregator _eventAggregator;
public BaseViewModel(IEventAggregator _eventAggregator)
{
MyText = "Update Number at Here !";
this._eventAggregator = _eventAggregator;
}
затем объявите свойство:
private String _myText;
public String MyText
{
get { return _myText; }
set
{
Debug.WriteLine($"this.Set(ref _myText, value);");
this.Set(ref _myText, value); // or
//_myText = value;
//NotifyOfPropertyChange(() => MyText);
}
}
и, наконец, дескриптор:
public void Handle(HelloMessage message)
{
Debug.WriteLine($"Handle(HelloMessage message)/{message.UiAsync}/{message.msg}");
if (message.UiAsync)
{
Execute.OnUIThreadAsync(() =>
{
MyText = message.msg;
});
/*Execute.OnUIThread(() =>
{
_myText = message.msg;
MyText = _myText;
});*/
}
else
{
MyText = message.msg;
}
}
Не обновлять закрытую переменную _myText, а только открытую переменную MyText
каждый раз, когда вы обновляете переменную MyText, NotifyOfPropertyChange отправляет обновление представлению.
используя this.Set или две строки в комментариях одинаковы .. обе они вызывают последний метод в caliburn:
/// <summary>
/// Notifies subscribers of the property change.
/// </summary>
/// <param name="propertyName">Name of the property.</param>
// Token: 0x060000BF RID: 191 RVA: 0x0000342C File Offset: 0x0000162C
public virtual void NotifyOfPropertyChange([CallerMemberName] string propertyName = null)
{
if (this.IsNotifying && this.PropertyChanged != null)
{
this.OnUIThread(delegate
{
this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
});
}
}