为什么我的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
的唯一实例。
我想念什么?