繁体   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