【问题标题】:Get the DisplayMember value of any object in ListBox in WPF获取WPF中ListBox中任意对象的DisplayMember值
【发布时间】:2014-05-21 07:24:38
【问题描述】:

我有一个 ListBox,它的项目由自定义类对象组成(可以是任何类)。

然后我设置 DisplayMemberPath 以便 ListBox 显示该自定义类的正确属性。

现在我需要枚举ListBox的Items列表,并获取列表中每一项的DisplayMember值,而不知道列表中类的类型。有没有什么方法可以在没有反射的情况下获得这个 DisplayMember 值?

【问题讨论】:

  • 让你的所有自定义类都由一个接口实现
  • 那肯定行。我希望有一些通用的解决方案,因为我正在制作一个自定义用户控件,它具有高级文本搜索功能来搜索组合框的值,并且不想将它绑定到某个界面。毕竟我认为 ListBox 显示显示成员的方式毕竟是反射..

标签: c# wpf listbox


【解决方案1】:

在 WPF 中,您无需为容器控件实现接口或基类即可读取属性值。在理想情况下,声明一个基类或接口并让您的所有自定义类扩展或实现它们是有意义的,但这样做的好处实际上是保证您的数据类型安全。

例如,在 WPF 中,这是完全合法的,并且可以正常工作:

public class RadioButtonData
{
    public string Label { get; set; }
    public bool IsSelected { get; set; }
}

public class CustomData
{
    public string Label { get; set; }
    public string Value { get; set; }
}

...

private ObservableCollection<object> objects = new ObservableCollection<object>();
public ObservableCollection<object> Objects
{
    get { return objects; }
    set { objects = value; NotifyPropertyChanged("Objects"); }
}

...

Objects.Add(new RadioButtonData() { Label = "Some Value" });
Objects.Add(new CustomData() { Label = "Another Value" });

...

<ListBox ItemsSource="{Binding Objects}" DisplayMemberPath="Label" />

所以只要你的各个类具有相同的属性名称,那么它们都会以相同的方式显示,如上所示。它们甚至不必属于同一类型...只要名称与 ListBox.DisplayMemberPath 属性中使用的名称匹配即可。


更新>>>

对不起,我误解了你的问题。如果您想在代码中访问这些属性值,那么您有四个基本选项:

  1. 定义具有特定属性的接口并让您的自定义类实现它。
  2. 声明具有特定属性的基类并使您的自定义类扩展它。
  3. 创建一个(可能很长)if else 语句的部分,用于检查每个对象的类型,然后访问相关属性。
  4. 使用反射。

在我个人看来,我会先推荐选项 1 或 2,然后是 4,最后是 3。我真的不确定您反对反思的理由,但它真的没有那么糟糕,或者很慢......我会当然更喜欢使用它,而不是为每种可能使用的类型使用 else if 语句。

【讨论】:

  • 问题是:例如,如果我在 for 循环中遍历这些对象,有没有办法获得这个显示的值:foreach (var obj in listbox.Items) { Console.WriteLine( obj .DisplayMember
  • 我可以像这样使用反射,但我希望有一个不使用反射的解决方案: foreach (var obj in listbox.Items) { Console.WriteLine( obj.GetType().GetProperty (listbox.DisplayMemberPath).GetValue(val, null).ToString()); }
  • 对不起,我误解了你的问题。请查看我的答案更新。
  • 我喜欢反射,但不确定它是否适用于混淆程序集? - 很好的答案谢里登
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2022-01-11
  • 1970-01-01
  • 2019-02-09
  • 2017-05-07
  • 1970-01-01
相关资源
最近更新 更多