C# DataGrid如何绑定到任何集合的属性?
我正在制作一个WPF用户控件,我希望在绑定的意义上具有与DataGrid控件类似的行为。我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:可以将DataView作为ItemsSource传递,也可以传递任何对象集合。DataGrid如何决定是绑定到DataView的列,还是仅通过查看以下内容来绑定到object的属性:C# DataGrid如何绑定到任何集合的属性?,c#,wpf,binding,datagrid,C#,Wpf,Binding,Datagrid,我正在制作一个WPF用户控件,我希望在绑定的意义上具有与DataGrid控件类似的行为。我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:可以将DataView作为ItemsSource传递,也可以传递任何对象集合。DataGrid如何决定是绑定到DataView的列,还是仅通过查看以下内容来绑定到object的属性: <DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn*
<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>
提前谢谢。我想:
您可以获取其
集合
的元素的类型
,该类型的类型
具有方法,该方法返回其类型中可用的所有公共属性,并且在其知道所有公共属性后,可以与它们绑定 这是一个复杂的区域;下面是winforms绑定的分解,但我知道WPF绑定并没有那么不同
- 给定一个对象,绑定代码要做的第一件事就是查找
——如果是这样,则使用IListSource
获取实际绑定(这就是数据表如何成为绑定目的的数据视图)GetList()
- 之后,通常会检查源的
;这是获取模型表示的伪属性(ITypedList
)的一种灵活方式;数据视图实现了GetItemProperties()
,为每个实例创建伪属性ITypedList
- 否则,可能会识别数据的明显类型,这意味着:
- 查找形式为
的索引器-请注意,大多数集合都会满足此条件public SomeType this[int index]{get;}
- (不由winforms完成,但可能用于WPF)通过反射解析
或IList
中的IEnumerable
,如果对象实现了这些接口T
- 从sorce中获取第一个对象(如果有),并使用
GetType()
- 查找形式为
- 一旦知道类型,
就可以用来获取属性;在许多情况下,这将通过反射实现,但也可以添加间接层(通过TypeDescriptor.GetProperties(type)
)来提供类型的属性(可以在运行时添加,这非常方便)TypeDescriptionProvider
- 在单个绑定(非列表绑定)的情况下,还有
——除了反射和TypeDescriptor.GetProperties(obj)
,它还支持TypeDescriptionProvider
,可由单个对象实现,以在运行时提供自定义属性(与ICustomTypeDescriptor
非常相似,但由单个对象负责属性)TypeDescriptionProvider
我不知道这在多大程度上适用于WPF绑定,但我非常确定
IListSource
和ITypedList
处理是相同的。从内存来看,大多数(全部?)winforms策略的一部分将在WPF上工作-因此可能是这样,并且更改是附加的挂钩。检查这一点,@Sandeep G B这不是我的问题。我知道如何进行绑定,我想知道DataGrid如何在内部对任何对象进行绑定。是的,但它如何对DataView工作?它是DataRowView对象的集合,以及那些objects没有列属性,它们仍然绑定到列。我认为这篇文章应该会有所帮助。字段(字符串)-可以搜索吗?谢谢,你的回答告诉了我如何解决我的问题。