【发布时间】:2015-07-14 22:53:08
【问题描述】:
我正在尝试构建一个显示所选项目的 ComboBox。我可以让组合框很容易地显示选项,但是让选定的项目显示是行不通的。所选项目是指从数据库中提取的值。
我知道 set 方法有效,因为我可以成功存储用户的选择。但是,当我从数据库中抓取它时,我似乎无法让 ComboBox 填充所选项目。
我已经为此沮丧了几个星期,我觉得这个错误很简单。
场景:
我有一个Animal Model
public class AnimalModel
{
public string AnimalName { get; set; }
...
}
每个Animal都有一个AnimalViewModel:
public class AnimalViewModel: BindableBase
{
private AnimalViewModel _animal;
public AnimalViewModel(AnimalModel animal)
{
_animal = animal;
}
public string AnimalName
{
get { return _animal.Name; }
set
{
if (value != this._animal.Name)
{
this._animal.Name = value;
OnPropertyChanged("AnimalName");
}
}
}
...
}
我有一个 ObservableCollection 的 AnimalViewModel 对象:
public class TemplateViewModel : BindableBase
{
private ObservableCollection<AnimalViewModel> _animals;
public TemplateViewModel(...)
{
_animal = methodReturnsAnObservableCollectionOfAnimalViewModels();
}
public ObservableCollection<AnimalViewModel> Animals
{
get { return _animals; }
set
{
if (value != this._animals)
{
this._animals = value;
OnPropertyChanged("Animals");
}
}
}
}
有了这个,我可以轻松地在 ComboBox 中显示AnimalNames 的列表:
<ComboBox ItemsSource="{Binding Animals}"
DisplayMemberPath="AnimalName"
IsEditable="True"
IsReadOnly="True"
Text="--- Select Animal ---"/>
我现在绑定到 SelectedItem
public class TemplateViewModel
{
...
private AnimalViewModel _selectedAnimal;
public TemplateViewModel(MyObject, ...)
{
...
_selectedAnimal = new AnimalViewModel(new AnimalModel() { AnimalName = MyObject.AnimalName });
}
...
public AnimalViewModel SelectedAnimal
{
get { return _selectedAnimal; }
set
{
if (value != _selectedAnimal)
{
_selectedAnimal = value;
AnimalName = value.AnimalName;
OnPropertyChanged("SelectedAnimal");
}
}
}
}
所以现在,我有:
<ComboBox ItemsSource="{Binding Animals}"
DisplayMemberPath="AnimalName"
SelectedItem={Binding SelectedAnimal}
SelectedValuePath="AnimalName"
IsEditable="True" IsReadOnly="True"
Text="--- Select Animal ---"/>
不幸的是,这不会用 Animal 填充 ComboBox。它只是拉出默认选项Select Animal 并填充了选项。它确实正确设置了项目。
任何帮助将不胜感激。
【问题讨论】:
-
我昨天回答了一个这样的问题here。同样的答案适用:)