2011-09-15 43 views
5

我正在做一个WPF用户控件,并且我想要在绑定的意义上与DataGrid控件类似的行为。我的问题是:DataGrid如何知道如何绑定到IEnumerable类型的任何集合?例如:您可以将一个DataView作为ItemsSource传递,并且您还可以传递任何对象集合。 DataGrid中如何确定是否只有看着这个绑定到数据视图的列,或对象的属性:提前DataGrid如何绑定到任何集合的属性?

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/> 

感谢。

+0

选中此http:// stackoverflow。com/questions/5488014/in-wpf-are-binding-path-and-binding-really-equal,http://stackoverflow.com/questions/3504480/when-to-use-path-in-wpf-binding和http://stackoverflow.com/questions/4742449/new-to-wpf-data-binding –

+0

@Sandeep GB这不是我的问题。我知道如何进行绑定,我想知道DataGrid如何与任何对象共享内存。 – Vale

回答

3

这是一个复杂的地区;以下是从winforms绑定分解,但我明白,WPF绑定没有那么不同;

  • 给出的对象,第一件事就是绑定代码会做的就是寻找IListSource - 如果是使用GetList()获得实际的结合(这是一个数据表是如何成为一个数据视图结合的目的)
  • 之后,通常检查源为ITypedList;这充当了获得由该模型表示的伪属性(GetItemProperties())的灵活方式;数据视图实现ITypedList,创建每个实例伪性能
  • 否则,有可能确定一个明显的类型的数据,这可能意味着:
    • 寻找形式public SomeType this[int index] {get;}的索引 - 注意,大多数集合将满足此
    • (未通过的WinForms完成,但可能是WPF)经由反射解决任一IList<T>IEnumerable<T>T如果对象实现这些接口
    • 取第一对象(如果有的话)从SORCE,并使用GetType()
  • 一旦知道类型,就可以使用TypeDescriptor.GetProperties(type)来获取属性;在许多情况下,这将通过反射,但也可以添加间接层(通过TypeDescriptionProvider)为类型提供属性(这可以在运行时添加,这可以非常方便)
  • 个别绑定(不是列表绑定),还有TypeDescriptor.GetProperties(obj) - 除了反射和TypeDescriptionProvider,这也支持ICustomTypeDescriptor,它可以由一个单独的对象实现以在运行时提供自定义属性(非常类似于TypeDescriptionProvider,但与个人对象承担对物业的责任)

我不知道到底多少这适用于WPF绑定,但我很确定IListSourceITypedList处理是相同的。从内存来看,大多数(所有?)的WinForms策略都可以在WPF上工作 - 所以可能是这样,并且更改附加的挂钩。

+0

谢谢,你的回答给了我如何解决我的问题的想法。 – Vale

0

我认为

你可以得到它的Collection的元素Type,这种类型的TypeGetProperties()方法,它返回它的类型所有可用的公共属性,和之后,它知道所有的公共属性,它可以与他们绑定。

+0

是的,但它如何与DataView一起工作?它是DataRowView对象的集合,并且这些对象没有Column属性,并且它们仍然绑定到列。 – Vale

+0

我认为这篇文章应该有助于[MSDN](http://msdn.microsoft.com/en-US/library/bb669099(v = VS.100).aspx)。字段(字符串) - 可能是你搜索这个? – stukselbax

相关问题