Nano Hash - криптовалюты, майнинг, программирование

WPF PropertyChange не обновляется, когда свойство вызывается во второй раз в том же блоке кода

Я отправляю событие изменения свойства для двух разных значений свойств в одном и том же блоке кода. Между ними находится команда сна. Окно не обновляет свойство.

XAML:

        <TextBlock Text="{Binding ReferenceRunExecuting}" />

Код позади:

        ReferenceRunExecuting = true;
        Thread.Sleep(TimeSpan.FromSeconds(2));
        ReferenceRunExecuting = false;

Имущество:

    private bool _referenceRunExecuting = false;

    public bool ReferenceRunExecuting
    {
        get { return _referenceRunExecuting; }
        set
        {
            if (value != _referenceRunExecuting)
            {
                _referenceRunExecuting = value;
                OnPropertyChanged("ReferenceRunExecuting");
            }
        }
    }

OnPropertyChanged:

    public void OnPropertyChanged(string propertyChanged)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyChanged));
    }
20.12.2019

  • Когда вы говорите, что окно не обновляет свойство, вы имеете в виду, что вы ожидаете, что значение в TextBox изменится на True на две секунды, а затем обратно на False? Если да, выполняете ли вы код в коде позади асинхронно? 20.12.2019
  • Вы выполнили отладку, чтобы убедиться, что метод set вызывается правильно? 20.12.2019
  • Как окно должно обновляться, когда вы блокируете поток пользовательского интерфейса? 20.12.2019

Ответы:


1

Похоже, вы на самом деле блокируете поток пользовательского интерфейса. Не рекомендуется использовать Thread.Sleep, так как это приведет к блокировке. Заблокированный поток пользовательского интерфейса означает замороженный пользовательский интерфейс.

Вы должны ждать асинхронно, используя Task.Delay:

private async Task WaitAsynchronously()
{
  ReferenceRunExecuting = true;
  await Task.Delay(TimeSpan.FromSeconds(2));
  ReferenceRunExecuting = false;
}

Также старайтесь по возможности избегать строковых литералов, так как они легко допускают ошибки и затрудняют рефакторинг (например, переименование свойства). Вместо этого используйте nameof.

public bool ReferenceRunExecuting
{
  get { return _referenceRunExecuting; }
  set
  {
    if (value != _referenceRunExecuting)
    {
      _referenceRunExecuting = value;
      OnPropertyChanged(nameof(this.ReferenceRunExecuting));
    }
  }
}

Или взгляните на CallerMemberNameAttribute :

public void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

и использовать его как

set
{
  if (value != _referenceRunExecuting)
  {
    _referenceRunExecuting = value;
    OnPropertyChanged();
  }
}  
20.12.2019

2

Окно не может быть обновлено, когда вы блокируете поток пользовательского интерфейса, который должен его обновлять. Вам нужно спать в фоновом потоке или ждать (спать) асинхронно:

ReferenceRunExecuting = true;
await Task.Delay(2000);
ReferenceRunExecuting = false;

ReferenceRunExecuting = true;
Task.Run(()=> Thread.Sleep(TimeSpan.FromSeconds(2)))
    .ContinueWith(_ => ReferenceRunExecuting = false);
20.12.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..