簡體   English   中英

在WPF中顯示選定的ComboBox項

[英]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");
            }
        }
    }
    ...
}

我有一個ObservableCollectionAnimalViewModel對象:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM