获取WPF中ListBox中任何对象的DisplayMember值

时间:2014-05-21 07:24:38

标签: c# wpf listbox

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

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

现在我需要枚举ListBox的Items列表,并获取列表中每个项目的DisplayMember值,而不知道列表中类的类型。有没有办法在没有反射的情况下获得此DisplayMember值?

1 个答案:

答案 0 :(得分: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" />

enter image description here

因此,只要您的各个类具有相同的属性名称,那么它们将以相同的方式显示,如上所述。他们甚至不必是同一类型......只要名称与ListBox.DisplayMemberPath属性中使用的名称相匹配。


更新&gt;&gt;&gt;

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

  1. 使用特定属性定义接口,并使您的自定义类实现它。
  2. 声明具有特定属性的基类,并使您的自定义类扩展它。
  3. 创建if else语句的(可能很长)部分,检查每个对象的类型,然后访问相关属性。
  4. 使用反射。
  5. 在我个人看来,我会首先推荐选项1或2,然后是4和最后3.我真的不确定你对反射的反应是什么,但它真的不是那么糟糕,或者很慢...我当然更愿意使用它,而不是对每种可能的类型使用else if语句。