Как отличить guish между изменением свойства зависимости внутри класса или снаружи - PullRequest
2 голосов
/ 29 марта 2020

Я создаю пользовательский элемент управления WPF. Элемент управления является таймером. Он существует из TextBox, содержащего строку, представляющую время, которое пользователь вводит (например, 16:35). Когда этот TextBox сфокусирован, открывается Popup, содержащий два отдельных текстовых поля для часа и минуты для удобного ввода.

enter image description here

Всплывающие текстовые поля и основное поле TextBox должно быть синхронизировано. Под этим я подразумеваю, когда пользователь изменяет час, нажимая клавиши со стрелками или вводя маленькое поле часа, главное текстовое поле (содержащее текст 16:35) должно быть обновлено, и наоборот. Поля во всплывающем окне могут принимать только символы [0-9]. При изменении основной строки времени TextBox строка анализируется, и два поля во всплывающем окне обновляются. Если пользователь вводит недопустимую строку времени в главном TextBox и элемент управления не может извлечь из нее часы и минуты для обновления всплывающих текстовых ящиков, то я просто ничего не делаю.

Кнопки со стрелками во всплывающем окне связаны к командам.

Я использую только класс пользовательского элемента управления. Я не прикрепляю DataContext и хочу использовать только свойства зависимостей.

У моего элемента управления есть несколько свойств зависимостей, и в пользовательском представлении, содержащем мой элемент управления, должно использоваться следующее свойство зависимостей:

  • Время типа TimeSpan

Для внутренней работы у меня также есть еще несколько свойств зависимостей:

  • Hour типа string (связывается с часовой TextBox в Popup)
  • Minute строки типа (привязка с минутным TextBox в Popup)
  • TextBoxText строки типа (привязка с основным TextBox)

Пример моей проблемы:

Когда пользователь меняет какое-либо поле, все поля управления должны быть синхронизированы. Поэтому, если текст в поле часа всплывающего окна изменяется, изменяется временная строка основного поля. Я делаю это с помощью измененных свойств зависимостей обратных вызовов, определенных в метаданных свойства зависимостей. Но проблема в том, что при использовании этих обратных вызовов вы не знаете, произошло ли изменение из шаблона элемента управления (действия непосредственно от пользователя) из самого класса, который устанавливает значение DP). Это вызывает порочные круги, и вы очень скоро потеряете обзор. Дело не в том, что моя программа аварийно завершает работу, но возникают проблемы, например, когда DP обновляются дважды и что-то вроде нежелательного поведения.

  1. TextBoxText изменен пользователем, введя в него временную строку (12:45)
  2. Обратный вызов DP вызывается, потому что TextBoxText DP меняет свое значение, поэтому элемент управления хочет обновить TextBoxes во всплывающем окне
  3. Текстовая строка TextBoxText анализируется, а часам и минутам DP устанавливаются новые значения.
  4. Часов DP вызывается обратный вызов, и вызывается обратный вызов DP Minute.
  5. В этом обратном вызове DP Hour и Minute необходимо обновить TextBoxText -> вызывает al oop (см. шаг 2). Потому что он не различает guish изменений извне (пользователь представления, использующего элемент управления) или изнутри (класс управления, который изменяет свои собственные DP).

Как это решить? Кто-нибудь, кто имеет опыт с этим, или я делаю что-то не так?

1 Ответ

1 голос
/ 29 марта 2020

Вот как я это делаю большую часть времени:

псевдокод:

callback(){
   if(flag){
      it's coming from program
   }
   else{
      it's coming from user
   }
}

button_event_handler(){
   flag = true
   do_stuff()
   flag = false
}

Однако есть и другие способы сделать это, если это не применимо к вашему коду.

Например, в случае сложных значений, таких как части даты и времени, вы можете сохранить фактическое значение DateTime в свойстве, которое связано с каждым из элементов управления через конвертер. Оно должно быть инъективным, иначе все закончится в oop. Под инъективным я подразумеваю, что каждое состояние элементов управления обновлением должно иметь только одно состояние текстового поля и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...