上节我们讲到,使用Binding,我们可以关联后台代码中的属性,在某些情况下,我们可能需要将两个控件关联起来,借助Binding,我们也可以轻松的实现。

关联控件

设想这样一个场景,界面中有个CheckBox,和一个Button,只有当CheckBox被选中的时候,Button才可用或者显示,如果按照常规的做法,那应该是借助CheckBox的Click事件去手动控制Button的显示等等,但我们如果使用Binding,则会简单很多,请看如下代码:

Binding有个ElementName的属性,是专门用于跟控件做绑定的,把某个控件的名字赋给它,系统会自动去这个控件上找Path指定的属性,CheckBox的IsChecked属性用来指示是否被选中, 将其绑定到Button的IsEnabled属性上,就可以实现两者的联动。

第二个Button则是使用Source的形式,借助x命名空间的Reference指令,拿到名称为CB的控件引用,将其作为源,效果是一样的。

其对应的后台代码为(部分):

Binding binding = new Binding();
binding.Source = CB; //控件引用
binding.ElementName = "CB"; //控件名

运行效果如下:

当然,这是在两个控件绑定的属性类型都一致的情况下,如果不一致呢?比如说上述情景中让Button显示和隐藏,显然bool是不能转换为Visibility枚举的,这就需要用到数据转换器了,我们下节再讲,它主要还涉及到XAML资源的知识,适合单独拿一节出来。

代码提升

在不使用第三方框架的情况下,我一般会使用如下代码来实现INotifyPropertyChanged接口:

public class NorifyBase:INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;protected void RaisePropertyChanged([CallerMemberName] string propertyName = null){OnPropertyChanged(new PropertyChangedEventArgs(propertyName));}protected virtual void OnPropertyChanged(PropertyChangedEventArgs args){this.PropertyChanged?.Invoke(this, args);}
}

将其再封装一层,并且放在一个类里边作为父类,由子类去继承,实现代码复用。

这样原来set块中的通知逻辑就改为了如下所示:

//旧代码
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Data"));
//新代码
this.RaisePropertyChanged();

此处要解释一下,CallerMemberName这个Attribute,它用来在运行时动态获取调用者的名字,简单来说就是在方法内调用它,它就获取到方法的名赋给参数,在属性块中调用它,它就获取到属性名赋给参数,在类中就是类名。

本节到此结束...

Binding(二):控件关联和代码提升相关推荐

  1. vue拖拽控件生成界面代码_Blue HMI人机界面开发平台

          随着信息技术在军工.制造业等领域的不断普及和快速发展,各行业信息系统软件的研制正在由传统的重复.烟囱式开发模式向以系统顶层设计为指导,以标准化.组件化.集成化软件开发为重点的模式逐步转变. ...

  2. MFC中如何给控件关联变量

    如图所示,在对话框中新建了一个Slider控件(IDC_Slider_test).现在想要给该控件关联一个变量,有两种方法. 一.通过对话框添加控件关联变量: 1. 首先为对话框添加类CDlgTest ...

  3. Xcode 开发 控件如何和代码配合使用

    Xcode 开发 控件如何和代码配合使用 1.如何找到Interface Builder. 看到网上不少教程里都有下面的图片,说明Xcode可以直接拖拉控件来进行编程,无赖看了很多教程以后,实在怎么点 ...

  4. 将控件关联的变量值传递到另外一个类中的方法

    今天在修改V1.1的一个bug:当向一个场景中加入已存的模型时会提示模型已存在,要求更改模型名称. 具体步骤如下: 1.新建一个对话框,ID为:IDD_RENAME,在此对话框中添加一个Edit控件, ...

  5. 用户控件的后台代码关联使用CodeBehind还是CodeFile

    在vs2005做asp.net的用户控件的时候,vs自动生成的第一行文字是<%@ Control Language="C#" AutoEventWireup="tr ...

  6. android 开发框架 怎么使用,Android快速开发框架dyh详解(二)---控件层的使用

    1.控件组合 1.1.ViewPager + Fragment, 这两个控件的组合在项目里也是比较常用的,效果同ViewPager,但由于是用Fragment所以可以使代码操作起来更方便: 1.1.1 ...

  7. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  8. Angular form控件原生HTML代码里ng-reflect-form属性和其值的生成时机

    简单的Component代码: import { Component } from '@angular/core'; import { FormControl } from '@angular/for ...

  9. android第三方代码,Android--第三方控件--okHttp(示例代码)

    Android中有很多的第三方控件,其中OkHttp是一个很强大的用于网络加载的第三方控件,当然了,它的内部也是使用原生的代码封装好的.今天我们就来看一下OkHttp的简单用法: 说到网络请求,肯定就 ...

最新文章

  1. 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
  2. C# winform 获取当前路径
  3. iOS之深入解析分类Category的底层原理
  4. 【渝粤教育】国家开放大学2018年春季 0703-22T经济学基础 参考试题
  5. wps临时文件不自动删除_电脑:让 Windows 10 系统自动清理临时文件
  6. CVPR 2020|超越H.265,中科大使用多帧数据改进视频压缩新方法
  7. 劝退与转行:没有什么是普适的
  8. 软件工程学习进度06
  9. Spring mvc 转发
  10. CSU 1805 Three Capitals(矩阵树定理+Best定理)
  11. 线程池工厂方法newFixedThreadPool()和newCachedThreadPool()
  12. 2021年中国城市建设状况公报有关供水、燃气、供热数据已出
  13. Linux文件打包成不同后缀的压缩文件
  14. 裁员浪潮,互联网人该何去何从?
  15. python掷骰子实验_Python基础(十二) 模拟掷骰子demo
  16. 迅雷新财报背后:下载一哥到艰难求生
  17. LINUX-查看历史操作记录
  18. Materials Studio 计算溶解度参数
  19. IT项目管理个人总结
  20. k-均值聚类算法_聚类算法-K-均值算法

热门文章

  1. 软件开发了10年,迷茫了
  2. Navigator 对象,能够清楚地知道浏览器的相关信息
  3. Jupyter notebook: TypeError: __init__() got an unexpected keyword argument 'io_loop 问题
  4. Vue 的路由实现 Hash模式 和 History模式
  5. vue 开发环境搭建
  6. 程序员必须知道的HTML常用代码有哪些?
  7. 在Activity不可见时暂停WebView的语音播放,可见时继续播放之前的语音
  8. codeforces 600D Area of Two Circles' Intersection
  9. [转载]工作面试时最难的25个问题
  10. Teams数据统计 - 通话记录