博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Binding介绍
阅读量:4971 次
发布时间:2019-06-12

本文共 3590 字,大约阅读时间需要 11 分钟。

一.Binding的源与路径

在大多数情况下Binding的源是逻辑层的对象,但有时候为了让UI元素产生一些联动效果也会使用Binding在控件间建立关联,

下面的代码是把一个TextBox的Text属性关联在了Slider的Value上

与之等价的C#代码是:

Binding binding = new Binding("Value") { Source = Slider1 }; this.textBox1.SetBinding(TextBox.TextProperty, binding);

二.控制Binding的方向及数据更新

  Binding在源与目标之间架起了沟通的桥梁,默认情况下数据既能通过Binding送达目标,也能够从目标返回源(收集用户对数据的修改)。有时候数据只需要展示给用户

、不允许用户修改,这时候可以把Binding模式更改为从源向目标的单向沟通,Binding还支持从目标向源的单向沟通以及只在Binding关系确立时读取一次数据。

控制Binidng数据流向的属性是Mode,它的类型是BindingMode枚举。BindingMode可取值为TwoWay、OneWay、OnTime、OneWayToSource和Default。这里

的Default值是指Binding的模式会根据目标的实际情况来确定,比如若是可编辑的(TextBox.Text属性),Default就采用双向模式、若是只读的(TextBlock.Text)则采用单向模式

  当我们拖动Slider的手柄时,TextBox里就会显示出Slider当前的值;如果我们在TextBox里输入一个恰当的值,然后按一下Tab键,让焦点离开TextBox,则Slider的手柄会跳到

相应的值那里,为什么一定要在TextBox失去焦点之后Slider的值才会改变?这就引出了Binding的另一个属性——UpdateSourceTrigger,它的类型是UpdateSourceTrigger枚举,

可取值为PropertyChanged、LostFocus、Explicit和Default。对于TextBox默认值Default的行为与LostFocus一致,我们只要把这个属性改为PropertyChanged,则Slider的手柄

就会随着我们在TextBox里输入而改变位置

三.使用ObjectDataProvider对象作为Binding的Source

  由于一个类的所有数据都使用属性暴露出来,比如我们需要的数据可能是方法的返回值,这时候就需要使用ObjectDataProvider来包装作为Binding源的数据对象了

如下:

public class Calculator    {        //加法        public string Add(string arg1, string arg2)        {            double x = 0;            double y = 0;            double z = 0;            if(double.TryParse(arg1, out x)&& double.TryParse(arg2,out y))            {                z = x + y;                return z.ToString();            }            return "Input Error!";        }    }

这个程序实现的功能是上面两个TextBox输入数字后,第3个TextBox能实时地显示数字的和

private void SetBinding()        {            //创建并配置ObjectDataProvider对象            ObjectDataProvider odp = new ObjectDataProvider();            odp.ObjectInstance = new Calculator();            odp.MethodName = "Add";            odp.MethodParameters.Add("0");            odp.MethodParameters.Add("0");            //以ObjectDataProvider对象为Source创建Binding            Binding bindingToArg1 = new Binding("MethodParameters[0]")            {                Source = odp,                BindsDirectlyToSource = true,                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged            };            Binding bindingToArg2 = new Binding("MethodParameters[1]")            {                Source = odp,                BindsDirectlyToSource = true,                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged            };            Binding bindingToResult = new Binding(".") { Source = odp };            //将Binding关联到UI元素上            this.textBoxArg1.SetBinding(TextBox.TextProperty, bindingToArg1);            this.textBoxArg2.SetBinding(TextBox.TextProperty, bindingToArg2);            this.textBoxResult.SetBinding(TextBox.TextProperty, bindingToResult);        }

四.使用Binding的RelativeSource

当一个Binding有明确的数据来源时我们可以通过为Source或ElementName赋值的办法让Binding与之关联,有时候我们不能确定作为Souce的对象叫什么,但知道它作为Binding目标的对象在UI布局上有

相对关系,比如控件自己关联自己的某个数据、关联自己某级容器的数据,这时候我们就要使用Binding的RelativeSource属性

AncestorLevel属性指的是Binding目标控件作为起点的层级偏移量——d2的偏移量是1、g2的偏移量是2,以此类推,AncestorType属性告诉Binding寻找哪个类型的对象作为自己的源,

不是这个类型的对象会被跳过,上面这段代码的意思是告诉Binding从自己的第一层依次向外找,找到第一个Grid类型对象后把它当做自己的源。

 

转载于:https://www.cnblogs.com/QingYiShouJiuRen/p/10497388.html

你可能感兴趣的文章
静态链表
查看>>
Java作用域
查看>>
[Emacs] Org-mode下表格内中英文不对齐的解决方案
查看>>
spring中增加自定义配置支持
查看>>
End Point
查看>>
关于下载gitbash客户端
查看>>
支付宝钱包手势password破解实战(root过的手机可直接绕过手势password)
查看>>
python 操作MongoDB
查看>>
用Nginx实现微信小程序本地SSL请求
查看>>
Struts表单重复提交
查看>>
请说出call、apply、bind的区别
查看>>
WKWebView强大的新特性
查看>>
_DataStructure_C_Impl:图的遍历
查看>>
Linux环境变量PS1配置
查看>>
broadleaf commerce到mysql和tomcat的迁移
查看>>
【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合...
查看>>
IDEA生成增强for循环
查看>>
图表插件echars的使用案例
查看>>
model相关
查看>>
Echarts 图例交互事件
查看>>