您可以通过绑定从视图模型设置ComboBox中的选定项目吗?

时间:2019-01-30 23:26:59

标签: c# wpf data-binding combobox

为什么我的ComboBox没有从viewmodel更新?我的目标是使用ComboBox作为运行查询的触发器。用户选择一个查询,屏幕将更新。同时,ComboBox应该将自己重置为“选择过滤器...”项。但是选择之后,它停留在用户选择的项目上。

ViewModel代码

public class FilterManagerViewModel : ViewModelBase
{
  private CBFilterDefinition _noSelectionFilter = new CBFilterDefinition() { FilterName = "Select a filter...", FilterDefinitionId = -1 };

  public FilterManagerViewModel()
  {
    PopulateFilterDefinitionList();
  }

  public List<CBFilterDefinition> FilterDefinitions { get; private set; }

  private void PopulateFilterDefinitionList()
  {
    FilterDefinitions = GetFilterDefinitions(_firmId, _screenId, CBBusinessLayer.UserId).OrderBy(x => x.FilterName).ToList();
    FilterDefinitions.Insert(0, new CBFilterDefinition() { FilterName = "<Ad Hoc Filter...>", FilterDefinitionId = 0 });
    FilterDefinitions.Insert(0, _noSelectionFilter);

    OnPropertyChanged("FilterDefinitions");

    SelectedFilterDefinition = _noSelectionFilter;
  }

  public CBFilterDefinition SelectedFilterDefinition
  {
    get { return _noSelectionFilter; }
    set
    {
      if (value != null)
      {
        if (value.FilterDefinitionId == 0)
        {
          // Do some Ad Hoc filtery stuff, here.
        }
        else if (value.FilterDefinitionId > 0)
        {
          //Do some pre-defined filtery stuff, here.
        }
      }

      OnPropertyChanged("SelectedFilterDefinition");
    }
  }
}

ComboBox XAML

<ComboBox Grid.Column="1" ItemsSource="{Binding Path=FilterDefinitions}" SelectedItem="{Binding Path=SelectedFilterDefinition}"
          DisplayMemberPath="FilterName" Width="300" HorizontalAlignment="Left" AlternationCount="2" HorizontalContentAlignment="Stretch">

对我来说,这似乎很简单。但是,也许我认为我应该能够通过绑定设置所选项目的假设是不正确的。 (我确实尝试将绑定模式设置为TwoWay,但这没什么不同)

出于良好的考虑,我通过调试器验证了所有对象引用均指向_noSelectionFilter的相同实例。但是该项目只有一个实例,因此无论如何我不确定它怎么可能是一个参考问题。我必须绑定到SelectedIndex吗? ComboBox已正确初始化,因此似乎初始设置有效。

SelectedFilterDefinition调用之后调用OnPropertyChanged getter,它返回_noSelectionFilter的唯一实例。

我想念什么?

0 个答案:

没有答案