【问题标题】:WPF ComboBox doesn't show selectionWPF ComboBox 不显示选择
【发布时间】:2014-11-05 10:13:22
【问题描述】:

场景:

MyControl类型的用户控件列表:

public List<MyControl> Controls { get; set; }
public MyControl SelectedControl { get; set; }

带有ItemsSourceComboBox 链接到Controls 属性:

<ComboBox ItemsSource="{Binding Path=Controls}" SelectedItem="{Binding Path=SelectedControl}" DisplayMemberPath="HeaderTitle" >

问题是ComboBox 正确显示了项目,但是当我选择一个项目时,它没有出现在ComboBox 中。为什么?

PS:HeaderTitleDependencyPropertyMyControl 类型。

【问题讨论】:

  • 您是否尝试从代码中设置它?因为在这种情况下,您需要实现 INotifyPropertyChanged 并在设置 SelectedControl 属性时引发 PropertyChanged 事件
  • 我正在使用 MVVM 模式。 INotifyPropertyChanged 实现得很好。

标签: c# wpf combobox


【解决方案1】:

我认为这是WPF - Combobox SelectedItem not getting set?的副本

因此我想引用 Heinz K 的回答https://stackoverflow.com/a/3506262/6071619

我遇到了同样的问题,并通过覆盖我的 CustomObject 中的 Equals() 方法并比较了 Id 属性来解决它。

如果选择的项目与列表中包含的实例不同,则必须重写 CustomObject 中的 Equals() 以让 ComboBox 知道它是同一个对象。

如果是同一个实例,也许只是简单的事情,比如将BindingMode设置为TwoWay:

SelectedItem="{Binding Path=CustomSettingProperty,Mode=TwoWay}"

【讨论】:

    【解决方案2】:

    尝试为 ComboBox 设置 DataContext?

    <ComboBox DataContext="{Binding Controls}" ItemsSource="{Binding Controls}" DisplayMemberPath="HeaderTitle">
    

    只要设置了 ItemsSource 和 DisplayMemberPath,您就不必绑定 SelectedItem 属性。

    【讨论】:

    • 如果将 DataContext 设置为 Controls,则无法将 ItemsSource 设置为 Controls...
    • 您可以为 ComboBox 的子容器设置 DataContext 吗?您能否发布 HeaderTitle 属性的定义以及如何将 MyControl 对象填充到列表中?
    • SelectedItem 属性不同。它从不用于在组合框中显示项目。
    【解决方案3】:

    尝试像这样绑定它..

    <ComboBox ItemsSource="{Binding Controls}" SelectedItem="{Binding SelectedControl, Mode=TwoWay}" DisplayMemberPath="{Binding HeaderTitle}" >
    

    您实际上不需要将选定的属性绑定到其类...它也可以只是一个字符串。所以只需将所选项目存储在字符串类型中,然后从列表中获取与所选项目匹配的项目。

    【讨论】:

    • 您提出的替代解决方案就是我现在正在做的事情。但我很想知道为什么第一种方法不起作用......
    • MyControl 中有哪些项目?它实际上对我来说似乎也是正确的。
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多