我正在制作一个WPF用户控件,我希望在绑定意义上与DataGrid控件类似。我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:您可以将DataView作为ItemsSource传递,也可以传递任何对象集合。 DataGrid如何通过查看以下内容来决定是绑定到DataView列还是绑定到对象的属性:
<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>
提前致谢。
答案 0 :(得分:3)
这是一个复杂的领域;以下是winforms绑定的细分,但据我所知,WPF绑定并没有那么不同;
IListSource
- 如果是,请使用GetList()
来获取实际绑定(这就是数据表成为数据视图的方式出于约束目的)ITypedList
;这可以作为获取模型所代表的伪属性(GetItemProperties()
)的灵活方式; data-view实现ITypedList
,为每个实例创建伪属性public SomeType this[int index] {get;}
形式的索引器 - 请注意,大多数集合都会满足此T
或IList<T>
中的IEnumerable<T>
GetType()
TypeDescriptor.GetProperties(type)
可用于获取属性;在很多情况下,这将通过反射,但也可以添加一个间接层(通过TypeDescriptionProvider
)来提供类型的属性(这可以在运行时添加,这可以非常方便)TypeDescriptor.GetProperties(obj)
- 除了反射和TypeDescriptionProvider
之外,它还支持ICustomTypeDescriptor
,可以通过一个单独的对象,用于在运行时提供自定义属性(非常类似于TypeDescriptionProvider
,但单个对象负责属性)我不知道究竟有多少适用于WPF绑定,但我非常确定IListSource
和ITypedList
处理是相同的。从内存来看,大多数(全部?)winforms策略都可以在WPF上运行 - 所以可能就是这样,而且更改是额外的挂钩。
答案 1 :(得分:0)
我认为:
您可以获取其Type
元素的Collection
,此类型Type
具有GetProperties()方法,该方法返回其类型中可用的所有公共属性,并且知道所有公共属性,它可以与它们绑定。