艾伟:WPF中,如何将绑定源设置到单件实例
大概两个月前,曾有位朋友问我:如果我想在WPF中将绑定源设置到某个采用单件模式设计的实例上,应该怎么做呢?这是一个不错的问题.可能这段时间比较忙,呵呵,忘记回答这个问题了,昨天拿到伍迷大哥的《大话设计模式》(PS:强烈推荐该书哈,真的不错)时突然想起这个问题了.今天简要说一下:
首先我们简单地写一个使用了单件模式的MyButton类:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/assets/blank.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/assets/blank.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/assets/blank.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/assets/blank.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
OK,我们不讨论设计模式,我们讨论针对不同的单例提供方式,我们在XAML中如何使用它,这里所说的"单例提供方式"是指,要么是使用上面的Instance只读属性方式提供,或是使用GetInstance()方法(上面被注释掉的部分)来提供给客户程序.
要如何实现下面的功能:
绑定到MyButton的单件实例上(即Instance)}"/>
绑定到MyButton的单件实例上(即Instance)},Path=Content,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
1,若是使用属性方式提供:
这比较简单,你只需要了解x:Static标记就足够了.它负责对静态数据的引用.
首先,在Xaml代码中加入我们的名字空间:
![](/Images/OutliningIndicators/None.gif)
然后,这样使用就OK:
![](/Images/OutliningIndicators/None.gif)
PropertyChanged}"/>
看看效果吧:
改变下面文本框的文本,上面按钮上的文本也会随之改变,都是引用到同一个单例嘛:)
2,若是使用方法方式提供:
即采用下面的方式提供的
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/assets/blank.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
有可能这个单例类根本就不是你设计的,没有理由让人家将方法改成属性哈,没关系的,同样可以轻松解决.但你得了解在WPF中如何绑定到方法.
OK,我们在资源字典中添加一个如下的ObjectDataProvider:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
ObjectType="{x:Type local:MyButton}" MethodName="GetInstance"/>
![](/Images/OutliningIndicators/None.gif)
其将从MyButton类中的GetInstance方法的返回值取得对象,然后我们就可以像使用普通资源一样使用它了:
![](/Images/OutliningIndicators/None.gif)
PropertyChanged}"/>
效果图就不必看了哈,和上面的图一模一样.
另外:说到x:Static,另起一个问题:操作系统给我们提供很多资源,比如:桌面工作区的大小,系统颜色等,应该如何跟踪这些值呢.以前我的一个同事遇到这样一个问题,其应用程序主窗口铺满整个桌面工作区,但该窗口没有边框,其将窗口大小绑定到SystemParameters.WorkArea.Width和SystemParameters.WorkArea.Height上的,但其发现用户更改了工作区大小(比如将任务栏拖高一些,工作区就变小了)后,窗口却不知道这事而无法及时调整自身大小来适合新的工作区大小.这里需要说明的是,我们对应静态数据的引用常常会写成下面这种方式:
{x:Static SystemColors.WindowBrush},这是有效的,但当WindowBrush值发生变化后,你的应用是不会随之改变的
正确的方式是:
{DynamicResource {x:Static SystemColors.WindowBrush}}
艾伟:WPF中,如何将绑定源设置到单件实例相关推荐
- WPF中DatePiker值绑定以及精简查询
WPF中DatePiker值绑定以及精简查询 1.WPF中DatePiker值绑定 Xaml中值绑定使用Text <DatePicker Text="{Binding strMinDa ...
- WPF中ListBox的绑定
WPF中列表式控件派生自ItemsControl类,继承了ItemsSource属性.ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都 ...
- WPF中给文本框TextBox设置提示文字
<TextBlock Text="模板名称" Margin="20" ></TextBlock><TextBox x:Name=& ...
- WPF中检测U盘插入、拔出 实例
类代码: /// <summary>/// 声明一个委托,用于代理一系列自定义方法/// </summary>public delegate void FlashDiskDel ...
- 解读WPF中的Xaml
1.Overview 这篇文章主要分享从源代码角度解读wpf中xaml.由于源码查看起来错综复杂"随便找一个对象按下F12就是一个新的世界",看源码的感觉就是在盗梦空间里来回穿梭: ...
- 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第五讲 WPF中 Style
Style这个东西几乎是无处不在,这个类似于web开发中的css样式,想要做一个很丰富的UI,这个东西是必不可少的,我也不是专业的UI开发者,这边只能介绍Style在WPF中的用法 下面有一个下载地址 ...
- 在WPF中如何使用RelativeSource绑定
在WPF中如何使用RelativeSource绑定 原文: 在WPF中如何使用RelativeSource绑定 在WPF绑定的时候,指定绑定源时,有一种办法是使用RelativeSource. 这种办 ...
- Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)
原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) ------------------------------ ...
- [WPF 基础知识系列] —— 绑定中的数据校验Vaildation
[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 原文:[WPF 基础知识系列] -- 绑定中的数据校验Vaildation 前言: 只要是有表单存在,那么就有可能有对数据的校验需 ...
最新文章
- Linxu终端gcc与gcc -c的区别
- 码神之路博客项目构建记录
- 安装python 的包控制mysql的Python脚本与执行系统命令的Python脚本
- Go基础编程:基础数据类型
- 表面上在帮女朋友拍照,其实镜头瞄准的是......
- 【2019第十届蓝桥杯省赛C/C++B组题解】(非官方题解)
- 穿戴式设备的用户体验设计-郝华奇
- 不要放弃,你的梦想是这个世界上最伟大的事情。
- linux本地时间与utc不一致_辽宁无新增 | 北京新增本地确诊病例31例,中高考时间目前不做调整...
- FISCO BCOS流量控制实现
- 清理注册表 php,cad注册表怎么删干净
- SaaSBase:什么是SAP(思爱普) ERP?
- MySQL 中删除重复数据只保留一条
- 通用滑块识别-通杀滑块
- ristretto255 point压缩和解压缩算法(1)——affine坐标系下
- [global::]是什么形式?什么意思?
- 科研人,如何辨别期刊是正规期刊
- HashMap概述与用法总结
- Java基础 Java 泛型
- 遗传算法解整数规划IntCon
热门文章
- 计算机主机的拆卸步骤,电脑清灰详细图文教程解说
- 利用Vlan实现家庭网络单线复用
- 保研夏令营-南大、哈工、天大、中山、北理
- Linux常用命令——top命令
- Windows - win11取消鼠标右键菜单折叠的方法
- TS3180打印机喷头堵塞以及打印照片颜色偏暗完美解决
- mysql compact_[MySQL]InnoDB行格式剖析_MySQL - compact
- 【区块链 | 智能合约】Ethereum源代码(1)- 下载、编译、启动go-ethereum
- 洛谷 P1035 级数求和
- p51 thinkpad 拆解_ThinkPad P51硬盘更换指南(图解)