WPF - 几个关键点

5 篇文章 0 订阅

第一点,关于binding的。binding功能非常强大,也是wpf的基础之一;数据都靠它。

binding使用上的问题,可以看这个帖子 http://blog.csdn.net/fishhg/article/details/6244986


要想binding之后,数据可以同步更新,那么data source必须要么实现了INotifyPropertyChanged接口,要么是DependencyProperty。

关于这两者的选取与区别,以后再写一贴。可以先参考stack overflow的帖子

http://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel

http://kentb.blogspot.com/2009/03/view-models-pocos-versus.html


这里先说dp要注意的两点。
首先DependencyProperty只能定义在DependencyObject中。如果你要再非DependencyObject中使用dp,那么你只能自己定义一个派生自DependencyObject的class,在其中定义你需要的DependencyProperty。使用的时候,通过DependencyObject_Instance.DependencyProperty_Name的方式在binding中使用。
参考 http://stackoverflow.com/questions/1349034/dependency-property-in-app-xaml-cs

其次,dp的setter与getter不能被保证一定会被调用!如果dp是two way binding,当dp通过UI的data binding而不是code来更新,GetValue/SetValue会被直接调用。
如果有change时必须要执行的logic,可以通过给dp的metadata定义一个callback,在GetValue/SetValue时触发;这样确保不会遗漏。

参考http://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel中Adam的答案


DataContext的继承是针对visual tree的?以后确认,先记下了。

http://stackoverflow.com/questions/7660967/wpf-error-cannot-find-govering-frameworkelement-for-target-element


第二点是有关Template的;以此可以构造灵活多变的control

ControlTemplate是针对control本身的;而DataTemplate对container一类的空间而言,作用在包含其中的各个数据元素的。两者具体使用参考msdn。

Template高级的应用之一就是user control; 看看下面的帖子来了解个大概吧!

http://stackoverflow.com/questions/5758342/how-to-create-wpf-usercontrol-which-contains-placeholders-for-later-usage?answertab=votes#tab-top


第3点是UI update的thread问题。
control的更新只能在创建其的thread中,而创建的thread必是UI thread。这里会用到SynchronizationContext和Dispatcher的知识。
同样的,DependencyProperty也是(it can only be accessed on the thread on which it was created)。

通常纯粹使用wpf都不会碰到这个问题。当和wcf结合时,为了不让UI没反应,数据的来源常常是在另外的一个background 的work thread,那么就会面对这个问题。一般比较常见的做法是,记录UI thread的SynchronizationContext, 并用这个UI SynchronizationContext来post数据更新的操作:当然,这个过程可以放在thread pool中的另一个thread中来处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值