从属性设置器中设置WPF组合框选定项

时间:2018-05-14 13:05:32

标签: xaml combobox selecteditem 2-way-object-databinding

我正在使用带有数据绑定的WPF。我有一个Combobox绑定到一个字符串列表。我希望列表中的所选项目在我的视图模型中设置一个字段。但是,我有时想要覆盖用户的选择并在Combobox中重新设置所选的值,但我似乎无法做到这一点。

这是视图模型代码:

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}"> 

但是,当我在GUI中选择256Hz时,显示的值保持为256Hz而不是更改为400Hz。如果我从单独的函数调用OnPropertyChanged(SelectedRate),则值会发生变化。

我已尝试使用SelectedValueUpdateSourceTrigger,但无法找到有效的内容。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

Unbelieveable。我在发布该问题之前花了几个小时寻找答案,但在发布后10分钟,我想到了一个新的搜索词,这让我得到了答案。

我只需要在XAML中将IsAsync="true"添加到SelectedValue

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

哦,希望这会帮助别人。

答案 1 :(得分:0)

添加Delay=1为我解决了该问题。 IsAsync=true方法也可行,但有时更新组合框的速度有时会变慢,并且在我的GUI中创建了一个错误,即在应用程序启动后一次更改gui中的Combobox值就无效。

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