Я создаю приложение с WPF и Caliburn.Micro. Я хочу, чтобы обновить ProgressBar из задач/Темы и мне интересно, что мне нужно, чтобы правильно обновить пользовательский интерфейс:Обновить свойство ViewModel из задачи
public class DemoViewModel : PropertyChangedBase
{
private int m_Progress;
public int Progress
{
get { return m_Progress; }
set
{
if (value == m_Progress) return;
m_Progress = value;
NotifyOfPropertyChange();
NotifyOfPropertyChange(nameof(CanStart));
}
}
public bool CanStart => Progress == 0 || Progress == 100;
public void Start()
{
Task.Factory.StartNew(example);
}
private void example()
{
for (int i = 0; i < 100; i++)
{
Progress = i + 1; // this triggers PropertChanged-Event and leads to the update of the UI
Thread.Sleep(20);
}
}
}
От других языков программирования, я знаю, что мне нужно синхронизировать с потоком пользовательского интерфейса для обновления пользовательского интерфейса но мой код просто работает. Есть ли что-то, что я пропустил и может вызвать спорадические ошибки или есть какая-то магия за кулисами, которые заботятся о синхронизации?
События INPC автоматически сортируются по потоку пользовательского интерфейса, поэтому вам не нужно беспокоиться. Но ... если вы обновите пользовательский интерфейс каждые 20 черных миллисекунд (Thread.Sleep (20) !!!!!!!), вы не увидите разъем в пользовательском интерфейсе, потому что он будет слишком занят, чтобы фактически обновить. – Will