Для связанных свойств и свойств, которые являются коллекциями (а не дочерними в наблюдаемых коллекциях), только поток OnPropertyChanged должен находиться в потоке пользовательского интерфейса.Свойства могут измениться раньше, но пользовательский интерфейс не изменит привязки, пока не будет вызван OnPropertyChanged.
Все наши ViewModels являются производными от созданной нами ViewModelBase, которая реализует вспомогательный SendPropertyChanged, как показано ниже (поэтому нам никогда не придется беспокоиться о перекрестномнарезания резьбы).
Все наши свойства notify вызывают это вместо непосредственного вызова OnPropertyChanged.
Он также предоставляет обычно полезный метод OnUiThread, поэтому вы можете выполнить произвольный код в потоке пользовательского интерфейса:
protected delegate void OnUiThreadDelegate();
public event PropertyChangedEventHandler PropertyChanged;
public void SendPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.OnUiThread(() => this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)));
}
}
protected void OnUiThread(OnUiThreadDelegate onUiThreadDelegate)
{
if (Deployment.Current.Dispatcher.CheckAccess())
{
onUiThreadDelegate();
}
else
{
Deployment.Current.Dispatcher.BeginInvoke(onUiThreadDelegate);
}
}
Если вы не используете MVVM, а) извинения и б) позор вам:)