【WPF.NET开发】绑定源

本文内容

  1. 绑定源类型
  2. 在对象上实现绑定源
  3. 整个对象作为绑定源
  4. 集合对象作为绑定源
  5. 数据绑定中的权限要求
     

在数据绑定中,绑定源对象是指用户从其获取数据的对象。 本文讨论可以用作绑定源的对象类型,如 .NET CLR 对象、XML 和 DependencyObject 对象。

1、绑定源类型

Windows Presentation Foundation (WPF) 数据绑定支持以下绑定源类型:

  • .NET 公共语言运行时 (CLR) 对象

    可以绑定到任何公共语言运行时 (CLR) 对象的公共属性、子属性和索引器。 绑定引擎使用 CLR 反射来获取属性值。 实现了 ICustomTypeDescriptor 或具有已注册 TypeDescriptionProvider 的对象也可以使用绑定引擎。

  • 动态对象

    可以绑定到对象的可用属性和索引器,该对象实现 IDynamicMetaObjectProvider 接口。 如果可以访问代码中的成员,则可以绑定到该成员。 例如,如果动态对象使用户可以通过 SomeObject.AProperty 访问代码中的成员,则可以通过将绑定路径设置为 AProperty 来绑定到该成员。

  • ADO.NET 对象

    可以绑定到 ADO.NET 对象,例如 DataTable。 ADO.NET DataView 实现 IBindingList 接口,该接口提供绑定引擎侦听的更改通知。

  • XML 对象

    可以绑定到 XmlNodeXmlDocument 或 XmlElement,并对其运行 XPath 查询。 访问 XML 数据(标记中的绑定源)的便捷方法是使用 XmlDataProvider 对象 。

    使用 LINQ to XML,还可以绑定到 XElement 或 XDocument,或者绑定到对这些类型的对象运行查询而得到的结果。 使用 LINQ to XML 访问 XML 数据(标记中的绑定源)的便捷方法是使用 ObjectDataProvider 对象。 

  • DependencyObject 对象

    可以绑定到任何 DependencyObject 的依赖属性。 

2、在对象上实现绑定源

CLR 对象可能成为绑定源。 实现用作绑定源的类时,需要注意一些事项。

提供更改通知

如果要使用 OneWay 或 TwoWay 绑定,请实现适当的“属性更改”通知机制。 对于 CLR 或动态类,建议的机制是实现 INotifyPropertyChanged 接口。 

有两种方法通知订阅者属性更改:

  1. 实现 INotifyPropertyChanged 接口。

    这是建议的通知机制。 INotifyPropertyChanged 提供绑定系统所遵守的 PropertyChanged 事件。 通过引发此事件并提供已更改属性的名称,你将通知绑定目标更改。

  2. 实现 PropertyChanged 模式。

    每个需要通知绑定目标其更改的属性都有相应的 PropertyNameChanged 事件,其中 PropertyName 是属性的名称。 每次更改属性时都会引发该事件。

如果绑定源实现了其中一个通知机制,将会自动进行目标更新。 如果绑定源由于某种原因未提供正确的属性更改通知,则可以使用 UpdateTarget 方法来显式更新目标属性。

其他特征

下表提供了需要注意的其他要点:

  • 作为绑定源的数据对象可以在 XAML 中声明为资源,前提是它们有一个“无参数构造函数”。 否则,必须在代码中创建数据对象,并直接将其分配给 XAML 对象树的数据上下文,或者作为绑定的绑定源。

  • 用作绑定源属性的属性必须是类的公共属性。 不能出于绑定目的来访问显式定义的接口属性,也不能访问没有基实现的受保护、私有、内部或虚拟属性。

  • 不能绑定到公共字段。

  • 类中声明的属性类型是传递给绑定的类型。 不过,绑定最终所用的类型取决于绑定目标属性的类型,而不是绑定源属性的类型。 如果类型不同,可能需要编写一个转换器来处理自定义属性最初传递给绑定的方式。 有关详细信息,请参阅 IValueConverter

3、整个对象作为绑定源

可以将整个对象用作绑定源。 通过使用 Source 或 DataContext 属性指定绑定源,然后提供一个空白绑定声明:{Binding}。 适用的场景包括绑定到属于类型字符串的对象、绑定到具有感兴趣的多个属性的对象或绑定到集合对象。

你可能需要应用自定义逻辑,以便数据对于绑定的目标属性有意义。 自定义逻辑可以采用自定义转换器或 DataTemplate 的形式。 

4、集合对象作为绑定源

通常,要用作绑定源的对象是自定义对象的集合。 每个对象都用作重复绑定的一个实例的源。 例如,可能存在由 CustomerOrder 对象组成的 CustomerOrders 集合,其中应用程序会循环访问该集合以确定存在的订单数量,以及每个订单中的数据。

你可以枚举实现 IEnumerable 接口的任何集合。 但是,若要设置动态绑定,以便集合中的插入或删除操作可以自动更新 UI,则集合必须实现 INotifyCollectionChanged 接口。 此接口公开一个事件,只要基础集合发生更改,就必须引发该事件。

ObservableCollection<T> 类是公开 INotifyCollectionChanged 接口的数据集合的内置实现。 集合中的个别数据对象必须满足前面章节中所述的要求。 在实现自己的集合前,请考虑使用 ObservableCollection<T> 或现有集合类之一,例如 List<T>Collection<T> 和 BindingList<T> 等。

将指定集合作为绑定源时,WPF 不会直接绑定到该集合。 相反,WPF 实际上绑定到集合的默认视图。 

如果有高级方案,并且想要实现自己的集合,请考虑使用 IList 接口。 此接口提供可通过索引逐个访问的对象的非泛型集合,这可以提高性能。

5、数据绑定中的权限要求

与 .NET Framework 不同,.NET 运行时具有完全信任的安全性。 所有数据绑定都以与运行应用程序的用户相同的访问权限运行。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉特思米(gitusme)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值