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

  • 相关阅读:
    WPF 本地化语言设置
    WPF 调节树状图滚动条值
    WPF中ListBox的使用注意事项
    SQL 树状结构表中查出所所有父级/子级
    Vue创建
    wpf 控件注意事项
    链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
    排序-快速排序
    排序-堆排序
    图-图的遍历
  • 原文地址:https://www.cnblogs.com/xiaomaogong/p/3026070.html
Copyright © 2020-2023  润新知