【问题标题】:Set WPF Combobox selected item from property setter从属性设置器中设置 WPF Combobox 选定项
【发布时间】:2018-05-14 13:05:31
【问题描述】:

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

这是视图模型代码:

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,但找不到任何可行的方法。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    哦,好吧,希望这对其他人有帮助。

    【讨论】:

    • 非常感谢。我有一个类似的问题。这似乎可行,但当应用程序启动时,我必须选择两次不同的项目才能选择不同的项目。仍然比像以前那样在无限循环中冻结要好。使用调度程序还有另一种解决方案,但我无法让它工作。
    【解决方案2】:

    添加Delay=1 为我解决了这个问题。 IsAsync=true 方法也有效,但它似乎有时会更慢地更新组合框,并且它在我的 GUI 中创建了一个错误,即在应用启动后更改 gui 中的组合框值一次不起作用。

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

    【讨论】:

      猜你喜欢
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多