首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WPF中显示选定的ComboBox项

在WPF中显示选定的ComboBox项
EN

Stack Overflow用户
提问于 2015-07-14 22:53:08
回答 2查看 4.7K关注 0票数 2

我正在构建一个ComboBox,它将显示所选的项。我可以让组合框足够容易地显示选项,但让选定的项目显示不起作用。所选项引用从数据库中提取的值。

我知道set方法是有效的,因为我可以成功地存储用户的选择。但是,当我从数据库获取所选项目时,我似乎无法让ComboBox填充它。

几个星期以来,我一直为此感到沮丧,我觉得这个错误很简单。

场景:

我有一台Animal Model

代码语言:javascript
复制
public class AnimalModel
{
    public string AnimalName { get; set; }
    ...
}

我对每个AnimalViewModel Animal**:**都有一个

代码语言:javascript
复制
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:

代码语言:javascript
复制
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的列表:

代码语言:javascript
复制
<ComboBox ItemsSource="{Binding Animals}" 
          DisplayMemberPath="AnimalName" 
          IsEditable="True" 
          IsReadOnly="True" 
          Text="--- Select Animal ---"/>

I现在绑定到一个SelectedItem

代码语言:javascript
复制
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");
            }
        }
    }
}

所以现在,我有:

代码语言:javascript
复制
<ComboBox ItemsSource="{Binding Animals}" 
          DisplayMemberPath="AnimalName" 
          SelectedItem={Binding SelectedAnimal} 
          SelectedValuePath="AnimalName" 
          IsEditable="True" IsReadOnly="True" 
          Text="--- Select Animal ---"/>

不幸的是,这并没有用动物填充ComboBox。它只是使用填充了选项的默认选项Select Animal。它确实正确地设置了项目。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-15 17:22:59

您需要访问有关动物的实际reference

在代码背后,您创建一个动物,它看起来像动物在ObservableCollection,但它不是动物的参考。

更改(在加载动物之后)

代码语言:javascript
复制
 _selectedAnimal = new AnimalViewModel(...);

(只使用属性访问器,而不是后备存储变量;因此更改事件触发,顺便说一句)

代码语言:javascript
复制
SelectedAnimal = Animals[0];

测试应用程序(格式设置为删除网格行/列)

代码语言:javascript
复制
<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"/>

屏幕负载结果:

票数 4
EN

Stack Overflow用户

发布于 2015-07-14 23:55:34

我认为这是SelectedValuePath="AnimalName"和您的财产之间的命名差异。

代码语言:javascript
复制
public string Animal //<----Should Be AnimalName!
{
    get { return _animal.Name; }
    set
    {
        if (value != this._animal.Name)
        {
            this._animal.Name = value;
            OnPropertyChanged("AnimalName");
        }
    }
}

将您的属性更改为AnimalName,您就可以走了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31418767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档