第一点,关于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中来处理。