WPF,Silverlight-依赖属性与验证

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[]中的,如没有添加,有更新,使其用到时候在存储,牺牲时间换空间

原文地址:https://www.cnblogs.com/xiaomaogong/p/3026070.html