我正在构建一个ComboBox,它将显示所选的项。我可以让组合框足够容易地显示选项,但让选定的项目显示不起作用。所选项引用从数据库中提取的值。
我知道set方法是有效的,因为我可以成功地存储用户的选择。但是,当我从数据库获取所选项目时,我似乎无法让ComboBox填充它。
几个星期以来,我一直为此感到沮丧,我觉得这个错误很简单。
场景:
我有一台Animal Model
public class AnimalModel
{
public string AnimalName { get; set; }
...
}我对每个AnimalViewModel Animal**:**都有一个
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 of objects:
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");
}
}
}
}在此基础上,我可以轻松地在AnimalName中显示ComboBox的列表:
<ComboBox ItemsSource="{Binding Animals}"
DisplayMemberPath="AnimalName"
IsEditable="True"
IsReadOnly="True"
Text="--- Select Animal ---"/>I现在绑定到一个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 ---"/>不幸的是,这并没有用动物填充ComboBox。它只是使用填充了选项的默认选项Select Animal。它确实正确地设置了项目。
任何帮助都将不胜感激。
发布于 2015-07-15 17:22:59
您需要访问有关动物的实际reference。
在代码背后,您创建一个动物,它看起来像动物在ObservableCollection,但它不是动物的参考。
更改(在加载动物之后)
_selectedAnimal = new AnimalViewModel(...);(只使用属性访问器,而不是后备存储变量;因此更改事件触发,顺便说一句)
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"/>屏幕负载结果:

发布于 2015-07-14 23:55:34
我认为这是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,您就可以走了。
https://stackoverflow.com/questions/31418767
复制相似问题