1.在样式中,如果给样式的TargetType赋值(如TargetType="{x:TypeTextBox}"),而没有给样式x:Key分配值,那么该样式就会应用与所有TargetType设置的类型(TextBox),x:Key会隐式设置与TargetType一样的值(“{x:Type TextBox}”);如果,在样式中给x:Key设值后(“{x:Type TextBox}”除外),该样式就不会应用在所有TargetType设置的类型上了。
2.在ItemControl控件中,ItemSource和DataContext区别:
(1)DataContext 一般是一个非集合性质的对象,而ItemsSource 更期望数据源是 集合对象。
(2)DataContext 是 FrameworkElement 类中定义的一个依赖属性(Dependency property),ItemsSource是 在ItemsControl 类中定义的。所有继承自FrameworkElement 的类(控件)都可以使用DataContext属性并给其赋值,但我们只能给ItemsSource赋值为集合对象
(3)DataContext不能产生模板,它只能用来筛选出数据,供其它控件来绑定。而ItemsSource主要作用就是给模板提供数据。个人理解:在模板里使用Binding时(DataTemplate,ControlTemplate),DataContext不会提供数据源,只有ItemsSource才给模板提供数据。
(4)DataContext主要作用,在没有指定Binding的source时,只知道Path,它会沿着UI元素树一路向树的根部找去,梅路过一个元素节点,就看这个元素节点的DataContext是否有Path指定的属性,如果有,就把这个DataContext作为自己的source,没有就继续向根部找下去。(注意:DataContext被定义在FrameworkElement类里,因此,只有继承FrameworkElement的类,才能作为元素节点)
3.DataTemplate和ControlTemplate
ControlTemplate用于描述控件本身. 使用TemplateBinding来绑定控件自身的属性, 比如{TemplateBinding Background}
DataTemplate用于描述控件的Content. 使用Binding来绑定数据对象的属性, 比如{Binding PersonName}
一般来说, ControlTemplate内有一个ContentPresenter, 这个ContentPresenter的ContentTemplate就是DataTemplate类型
Control类型
- Template属性 (ControlTemplate类型)
- ContentPresenter
- ContentTemplate (DataTemplate类型)
ContentControl类型
- Template属性 (ControlTemplate类型) 继承自Control
- ContentTemplate (DataTemplate类型)
ItemsControl类型
- Template属性 (ControlTemplate类型) 继承自Control
- ItemsPanel属性 (ItemsPanelTemplate类型) 指定布局容器
- ItemTemplate属性 (DateTemplate类型) 每个Item的Template
4.Binding
在Binding对象中,主要成员可以分为这么几类:
1)路径:Path属性和XPath属性
2)源:Source、RelativeSource和ElementName
3)更新通知:NotifyOnSourceUpdated、NotifyOnTargetUpdated和NotifyOnValidationError
4)转换器:Converter、ConverterCulture和ConverterParameter
5)验证:ValidatesOnDataErrors、ValidatesOnExceptions、ValidatesOnNotifyDataErrors和ValidationRules
6)绑定方式:Mode,BindingMode枚举类型:TwoWay,OneWay,OneTime,OneWayToSource和Default
需要注意的是:Binding的目标必须是依赖对象的某个依赖属性。
4.1Binding path和source
对于Binding的Path及Source,并非要是依赖属性及依赖对象。几乎任何一个对象都可以作为Binding的Source,主要有普通CLR对象、ado.net对象、XML、Linq、依赖对象、容器的DataContext、RelativeSource和ObjectDataProvider等。
而Path就是普通CLR对象、容器的DataContext、RelativeSource和Linq的某个属性、
ado.net对象的某个字段、依赖对象的某个依赖属性和ObjectDataProvider的某个方法名。
这里需要注意一下几点:
1)有Path没Source,将去找其父元素有该Path的DataContext;
2)有Source没Path,则将Source也作为其Path;
3)无Source无Path,则将其父元素的DataContext既作为Source也作为Path