Установить WPF Combobox выбранный элемент из установщика свойств - PullRequest
0 голосов
/ 14 мая 2018

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

Вот код модели View:

public class SettingsViewModel : INotifyPropertyChanged
{
    public enum RateTypes
    {
        [Description("128Hz")]
        Hz128 = 4,
        [Description("256Hz")]
        Hz256 = 6,
        [Description("400Hz")]
        Hz400 = 7,
        [Description("512Hz")]
        Hz512 = 8,
        [Description("600Hz")]
        Hz600 = 9
    }

    RateTypes m_SelectedRate;
    List<string> RateOptions = ((RateTypes [])Enum.GetValues(typeof(RateTypes)))
                                                  .Select(o => o.Description())
                                                  .ToList();

    public string SelectedRate
    {
        get {return m_SelectedRate.Description();}
        set
        {
          if (value == RateType.Hz256)
          {
                MessageBox.Show("256Hz not an option with your system");
                m_SelectedRate= IMURate.Hz400;
          }
          else
          {
              m_SelectedRate = value;
          }
          OnPropertyChanged(nameof(SelectedRate));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyChanged)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyChanged);
            handler(this, e);
        }
    }
}

и XAML имеет:

<ComboBox Grid.SelectedItem="{Binding SelectedRate, Mode=TwoWay}" ItemsSource="{Binding RateOptions}"> 

Однако, когда я выбираю 256 Гц в графическом интерфейсе, отображаемое значение остается равным 256 Гц, а не меняется на 400 Гц. Если я вызываю OnPropertyChanged(SelectedRate) из отдельной функции, значение меняется.

Я пытался использовать SelectedValue и UpdateSourceTrigger, но не могу найти ничего, что работает.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Добавить Delay=1 исправил проблему для меня. Подход IsAsync=true тоже сработал, но, кажется, иногда обновляет комбобокс медленнее, и он вызывает ошибку в моем GUI, из-за которой изменение значения Combobox в графическом интерфейсе не работает после запуска приложения.

<ComboBox Grid.SelectedItem="{Binding SelectedRate, Mode=TwoWay, Delay=1}" ItemsSource="{Binding RateOptions}"> 
0 голосов
/ 14 мая 2018

Unbelieveable.Я потратил часы на поиск ответа, прежде чем опубликовать этот вопрос, но затем, через 10 минут после публикации, я подумал о новом поисковом запросе, который привел меня к ответу.

Мне просто нужно было добавить IsAsync="true" к SelectedValue в XAML:

<ComboBox Grid.SelectedItem="{Binding SelectedRate, Mode=TwoWay, IsAsync="true"}" ItemsSource="{Binding RateOptions}"> 

Что ж, надеюсь, это поможет кому-то еще.

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