[英]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.