TypeConverter:让实现该类的对象有能将Xaml中的普通string 特性 转化为自定义对象的能力(就是实现xaml中简单字符串跟面向对象属性互转的能力)
X命名空间: 就是专为XAML解析器所准备的
X:Name 与Name 区别:所有元素都有X:Name (包含Name属性概念),但是只要继承FramworkElement的类才有Name属性
X:key : 为资源添上检索的key(如style,动画,模板)
一下代码揭示了依赖属性和附加属性存取值的区别:
1 //Get dependancy value from DP System by 宿主对象(btn) 和DP对象 2 var value = btn.GetValue(Button.ContentProperty); 3 4 //Get attached value from DP System by 宿主对象(btn) 和DP对象(位于Grid的Row属性) 5 var attachedValue = btn.GetValue(Grid.RowProperty);
一下代码内写Binding的方式,并添加到InputBinding中实现鼠标的监听:
private void AddKeybinding(string path, MenuItem item) 2 { 3 KeyBinding kb = new KeyBinding(); 4 kb.Key = item.Key; 5 kb.Modifiers = item.Modifiers; 6 Binding binding = new Binding(); 7 binding.Path = new PropertyPath(path); 8 //连接目标和源 BindingOperations.SetBinding(kb, KeyBinding.CommandProperty, binding); 9 //item.MenuName = "TEST" + index.ToString(); 10 //index++; 11 this.InputBindings.Add(kb); 12 }
Binding的源问题:项目中我们一般不需要指定source通过给其父容器加DataContext就可以了,让他自己去找
关于验证方式,一共有3种方式
Exception: 当发生异常时(其实就是使用WPF默认的转换器从目标到源如string 转为相应的int)项目有用到
ValidationRules:实现ValidationRule并将其加到Binding里,不好跨属性验证
IDataErrorInfo:让源对象实现该接口(在内部维护一个以属性名为KEY,错误信息为value的字典),绑定引擎回去调用其有参属性判断得到error为不为空,项目验证的主要方式
但以上所有方式发生错误时,会将ValidationError对象加到Validation.Errors(附加属性)内
要想能成为Binding的目标必须要是DependencyObject,,WPF中的所有UI控件都是依赖对象
两种设置目标与源的方式:BindingOperations.SetBinding,FrameWorkElement.SetBinding
WPF 中目标与源的定义:
目标:继承DependencyObject,不需要实现IPropertyChanged也能通知Binding
源:任何对象,但是只有实现了IPropertyChanged才能通知Binding
依赖属性揭秘:本质上WPF会首先在Dependancy.Resister()时候将依赖属性名+宿主类型作为key(生成GlobalIndex),将new 的依赖属性对象放进DependancyProperty的静态名为PropertyFromName 的hasttable中,但我们需要设置值时直接传入dp(利用其GlobalIndex)检索位于该依赖对象上的EffectiveValueEntry[]中的,如没有添加,有更新,使其用到时候在存储,牺牲时间换空间