【问题标题】:WPF ComboBox does not show current item when it is a DependencyObject当 WPF ComboBox 是 DependencyObject 时,它不显示当前项目
【发布时间】:2011-04-16 17:04:42
【问题描述】:

我的 XAML 中有这个非常简单的组合框:

<ComboBox Name="cmb1" Width="200" Height="23" ItemsSource="{Binding}" />

这是我的代码:

public class Test //: System.Windows.DependencyObject
{
    public string Name { get; set; }

    public override string ToString() { return Name; }
}

public MainWindow()
{
    InitializeComponent();

    var col = new ObservableCollection<Test>();
    cmb1.DataContext = col;
    col.Add(new Test { Name = "A" });
    col.Add(new Test { Name = "B" });
    col.Add(new Test { Name = "C" });
    col.Add(new Test { Name = "D" });
}

只要 Test 类不是从 DependencyObject 继承的,一切都很好。但是当它被继承时,ComboBox 在未展开时不显示当前项
当我单击 ComboBox 并查看其下拉框时,当前项目被选中。

【问题讨论】:

  • 我发现如果我将 DisplayMemberPath="Name" 添加到 ComboBox,它会正常工作。现在,问题是为什么 DependencyObject(或 ComboBox)不使用 ToString() 方法并期望显示成员路径?
  • 将测试更改为标签(或其他一些选择的“依赖对象”)它工作正常。这是什么意思?

标签: wpf xaml binding combobox


【解决方案1】:

这是karmicpuppet 在一个现已删除的问题中的回答:

这很有趣。嗯,我看过 在 ComboBox 类中使用 Reflector 我在 ComboBox.UpdateSelectionBoxItems() 方法,它的一部分做了一些事情 喜欢:

如果 ItemTemplate, ItemTemplateSelector, 和 ItemStringFormat 没有设置,并且 所选项目是一个 DependencyObject 不是从 UIElement 派生的, 调用 ExtractString(selectedItem) 方法。

ComboBox.ExtractString(dObj) 另一方面,方法显然 检查 selectedItem 是否 (这是一个 DependencyObject)是 TextBlock、Visual 或 TextElement 显示适当的 细绳。否则,它将返回 字符串。空。

所以最简单的解决方案是在 Combobox 上进行设置:

ItemStringFormat="{}{0}"

【讨论】:

  • 听到 ComboBox 分别处理 DependencyObject 和其他类是一种解脱。现在更有意义的是,当它是一个 DependencyObject 时,为什么它不调用 Test 类的 ToString() 方法。谢谢。
【解决方案2】:

相关:请参阅this answer 我还有另一个问题。基于此,我认为这可能是一个错误。如果您至少执行以下操作之一,则选择应该有效:

  1. 指定项目模板。
  2. 指定一个 ItemTemplateSelector。
  3. 指定 ItemStringFormat。
  4. 从 UIElement 派生项目。

编辑:问题已被删除。请参阅我对这个问题的其他答案的解释。

【讨论】:

  • 哦,废话,问题被删除了。但是,是的,看看 bitboink 发布了什么。那应该解释它。 =)
猜你喜欢
  • 2019-09-11
  • 2018-12-04
  • 2011-07-09
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2013-07-14
相关资源
最近更新 更多