Выбранный элемент ComboBox не будет установлен, пока не завершится выполнение SelectionChangedCommand

Я использовал эту статью, чтобы настроить SelectionChangedCommand, к которому я могу привязаться из моей модели представления.

Вот мой взгляд:

<ComboBox Height="20" 
          SelectedItem="{Binding SelectedName}" 
          ItemsSource="{Binding NameCollection}"
          commandBehaviors:SelectionChangedBehavior.Command="{Binding SelectionChangedCommand}">

На мой взгляд, метод SelectionChangedCommand модели Executed:

 private void SelectionChangedExecuted()
 {
   // The logic in this method can take up to 30 seconds at times.
 }

Теперь моя проблема в том, что когда пользователь выбирает новое имя из моего comboBox, может пройти до 30 секунд, пока он не увидит, что выбрано его имя. Он покажет старое имя, пока метод SelectionChangedExecuted не завершится. В идеале, когда они выбирают имя, я хочу, чтобы это имя появилось немедленно, ТОГДА они могут подождать 30 секунд. Могу ли я сделать это с моей текущей настройкой?

Текущее поведение:
Текущий элемент в ComboBox: "Боб"
-Пользователь выбирает: "Стив"
-Пользователь ждет 30 секунд, в то время как текущий элемент в ComboxBox по-прежнему "Боб"
-30 секунд прошло, текущий элемент в ComboBox: "Стив"

Разыскиваемое поведение:
Текущий элемент в ComboBox: "Боб"
-Пользователь выбирает: "Стив", а текущий элемент в ComboBox "Стив"
-Пользователь ждет 30 секунд, в то время как текущий элемент в ComboxBox по-прежнему "Стив"
-30 секунд прошло, текущий элемент в ComboBox все еще: "Стив"

1 ответ

Причина в том, что вы исполняете SelectionChangedExecuted() метод синхронно в потоке пользовательского интерфейса. Вы должны сделать это асинхронно, используя async / await выполнить ваш код в фоновом рабочем потоке.

private static async void SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Selector selector = (Selector)sender;
    if (selector != null)
    {
         ICommand command = selector.GetValue(CommandProperty) as ICommand;
         if (command != null)
         {
             await Task.Run(() => command.Execute(selector.SelectedItem));
         }
    }
}
Другие вопросы по тегам