WPF新手之将如何将一个成员变量或自定义类绑定到控件

(再次叹一下中国的网络环境,搜出来的网页一大堆,可有用的没几个,基本是大家相互转,真正有了问题楞是找不到能解决的)

 

首先如果是基本类型的变量,或者是自定义的类,直接绑定到控件之后,控件只能显示其初始值,值的改变并不能更新UI,只有以下两种情况的绑定:
①绑定到某个控件的依赖属性DependencyProperty
②绑定到定义了INotifyPropertyChanged的类(ObservableCollection就是实现了该接口)

 

先看DependencyProperty。
可以把任何一个CLR对象绑定为DependencyProperty。在VS2010下输入propdp,按Tab,会生成一个模板

MyProperty就是你要绑定的成员,修改它之后按Tab,后面的自动都会改变,如:

这里的ownerclass是拥有此成员的类名(如:class ownerclass {//...})。最后一个参数VS自动生成的有问题,因为它放入了一个参数0。实际上应该是UIPropertyMetadata(Object, PropertyChangedCallback, CoerceValueCallback, Boolean),用于设置UI中的数据更改后回调的函数。一般删除之或者用默认构造函数就行。如果需要它,一个简单的定义如下:

注意这里是静态函数,由DependencyObject d来得到具体的通知对象。

然后在控件中进行绑定,如<TextBlock Text="{Binding ElementName=MainWin, Path=Test}"/>,对Test变量的使用一如普通变量。

 

注意:①使用DependencyProperty比INotifyPropertyChanged的方法性能要高。因为它用Hash实现,不需要反射,而且是WPF系统中相当底层的一个基类
②DependencyObjects are not marked as serializable
③The DependencyObject class overrides and seals the Equals() and GetHashCode() methods
A DependencyObject has thread affinity – it can only be accessed on the thread on which it was created。(这一点很重要,特别是当程序中用到注册事件时,因为这些往往要开新线程。比如我的这个软件中,将bool型IsNetworkAvailabe用DependencyProperty绑定到控件,然后注册事件NetworkAvailabilityChanged,在NetworkAvailabilityChangedEventHandler中更新IsNetworkAvailabe值,这样就会抛出异常)


在需要多线程 中操作的绑定变量,则需要用INotifyPropertyChanged

再看如何用INotifyPropertyChanged:
这里要将待绑定的变量包装在一个类中:

其中test就是我们要绑定的变量。(绑定一个变量写这么多一堆,有点不值,我另开一篇,做一个snippet模板,用来快速生成)。

绑定时不知为何上面的绑定方法不灵了,于是换成代码绑定吧:

 

最终,在我的应用场景中,这两者都没能有用,我注册了事件NetworkAvailabilityChanged,在其中去修改一个绑定到

ListBox的ObservableCollection,让其实现UI自动更新。但是总是会引起异常,我想可能是跨线程的原因吧。于是我试

着用DependencyProperty绑定一个变量,在NetworkAvailabilityChanged事件中修改,还是不行,

INotifyPropertyChanged也一样,BackgroundWorker也不行。最终没辙,在MainWindow中开了一个DispatcherTimer来轮

询一个普通的bool变量:

 虽说比较丑,但没法子啊,没这么多精力再去整了,先让它工作起来吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值