[英]Displaying a selected ComboBox Item in WPF
我正在尝试构造一个将显示选定项目的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中显示AnimalName
的列表:
<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 ---"/>
不幸的是,这并没有用动物填充组合框。 它只是拉起填充选项的默认选择“ Select Animal
”。 它确实正确设置了项目。
任何帮助,将不胜感激。
您需要访问有关动物的实际reference
。
在后面的代码中,您创建了一个动物 ,看起来像ObservableCollection中的动物,但通过引用不是动物。
更改( 加载动物后 )
_selectedAnimal = new AnimalViewModel(...);
到( 仅使用属性访问器,而不使用后备存储变量;因此会触发change事件,btw )
SelectedAnimal = Animals[0];
测试应用程序(删除网格行/列之类的格式)
<Label>SelectedItem</Label>
<TextBlock Text="{Binding SelectedItem, ElementName=cbMain}"/>
<Label >SelectedValue</Label>
<TextBlock Text="{Binding SelectedValue, ElementName=cbMain}"/>
<Button Click="ChangeSelectedValue">Set Selected Value</Button>
<ComboBox Name="cbMain"
ItemsSource="{Binding Ships}"
SelectedItem="{Binding Ships[0]}"
SelectedValuePath="Name"
Text="Select a Ship"/>
屏幕加载结果:
我认为这是SelectedValuePath="AnimalName"
与您的媒体资源之间的命名差异。
public string Animal //<----Should Be AnimalName!
{
get { return _animal.Name; }
set
{
if (value != this._animal.Name)
{
this._animal.Name = value;
OnPropertyChanged("AnimalName");
}
}
}
将您的属性更改为AnimalName,就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.