Пользовательский интерфейс Combobox сбрасывается после внутреннего обновления во время выбора - PullRequest
0 голосов
/ 08 мая 2019

У меня есть выпадающий список, связанный с Enum.Когда я нажимаю на новое значение в своем поле со списком, я генерирую сообщение на подключенное устройство и получаю ответ обратно.Я хочу сохранить любое полученное значение обратно.

Мое обычное старое связанное свойство выглядит так:

private Enum enumValue;

public Enum EnumValue
{
   get => enumValue;
   set
   {
     if (enumValue != value)
     {
         enumValue = value;
         sendToDevice();
     }

   }

}

Мое обновление с устройства выглядит так:

    public void SetValueFromDevice(string valueFromDevice)
    {
       enumValue = (Enum)Enum.Parse(EnumType, valueFromDevice);
       RaisePropertyChanged(nameof(EnumValue));
    }

Обратите внимание, что я устанавливаю приватную переменную enumValue напрямую, потому что я не хочу запускать другое исходящее сообщение на свое устройство, если мне это не нужно.

Вот ситуация: допустим, у меня есть enum, который выглядит следующим образом:

    public enum Sources
    {
        Off,
        Low,
        Mid,
        Hi
    }

Написанная мной прошивка не любит значение low в некоторых версиях устройства,Вместо этого он ответит тем же текущим значением.Я хочу отправить это обратно в поле со списком, вместо того, чтобы показывать неправильное значение пользователю.

Теперь, похоже, происходит, когда я нажимаю на элемент со списком, он отправляет сообщение на мое устройство, получаетответ, а затем отправляет его обратно соответствующим образом.Я могу пройти и увидеть, что выпадающий список выполняет «get» после того, как я позвонил RaisePropertyChanged, но, похоже, он вообще не обновляет выбранный элемент.

Я могу вызвать SetValueFromDevice, и это всегдаработает, так что похоже, что это пользовательский интерфейс.

Я даже пытался полностью заставить его с помощью

 control.DropDownClosed += new EventHandler(SourceBox_DropDownClosed);
 ....
    private void SourceBox_DropDownClosed(object sender, EventArgs e)
    {
        ComboBox box = sender as ComboBox;
      box.GetBindingExpression(ComboBox.SelectedItemProperty).UpdateTarget();
    }

... и это ничего не сделало.Что я здесь не так делаю?Есть ли способ установить элемент в выпадающем списке во время взаимодействия выбора элемента?

1 Ответ

0 голосов
/ 08 мая 2019

Понял: мне нужно было сделать мой sendToDevice() вызов асинхронным, потому что я бы дважды вызывал RaisePropertyChanged в одном и том же процессе, и он только "видел" первый.

App.Current.Dispatcher.InvokeAsync(() => sendToDevice());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...