Начал разбираться в WPF, и сразу столкнулся с такой проблемой: в коде есть переменная, которую я постоянно меняю. Она отображается в форме в Label. Но при изменении ее в коде в форме она не меняется. Как это вообще реализуется? У меня эта переменная изменяется в отдельном фоновом потоке, и нужно, чтобы на экране она тоже обновлялась.
Для начала, вам нужно, чтобы переменная, которую вы отображаете на экране, была частью DataContext. Например, вы кладёте её в класс, и присваиваете DataContext'у его экземпляр:
class VM
{
public string Message { get; set; }
}
VM vm = new VM();
window.DataContext = vm;
Теперь можно привязаться к вашему свойству:
<Label Content="{Binding Message}"/>
Но это не всё. Для того, чтобы окно увидело изменения переменной, вы должны реализовать интерфейс INotifyPropertyChanged:
class VM : INotifyPropertyChanged
{
string message;
public string Message
{
get { return message; }
set { if (message != value) { message = value; NotifyPropertyChanged(); } }
}
void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Но и это ещё не всё. Теперь чтобы всё работало правильно, вам нужно устанавливать значение VM-свойства только в главном потоке. Как это делать — зависит от выбранных вами инструментальных средств.
Например, вы можете использовать BeginInvoke в вашем рабочем потоке. Или выполнять вычисления в фоне при помощи техники async/await.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости