我有一个ListBox,它的项目由自定义类对象组成(可以是任何类)。
然后我设置DisplayMemberPath,以便ListBox显示该自定义类的正确属性。
现在我需要枚举ListBox的Items列表,并获取列表中每个项目的DisplayMember值,而不知道列表中类的类型。有没有办法在没有反射的情况下获得此DisplayMember值?
答案 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" />
因此,只要您的各个类具有相同的属性名称,那么它们将以相同的方式显示,如上所述。他们甚至不必是同一类型......只要名称与ListBox.DisplayMemberPath
属性中使用的名称相匹配。
更新&gt;&gt;&gt;
对不起,我误解了你的问题。如果要在代码中访问这些属性值,则有四个基本选项:if else
语句的(可能很长)部分,检查每个对象的类型,然后访问相关属性。在我个人看来,我会首先推荐选项1或2,然后是4和最后3.我真的不确定你对反射的反应是什么,但它真的不是那么糟糕,或者很慢...我当然更愿意使用它,而不是对每种可能的类型使用else if
语句。