【.NET深呼吸】(WPF)跨窗口完成绑定
在99.999975%的情形下,可视化元素之间的相互绑定都会在同一个容器中完成,如同一个窗口,同一个UserControl等。但在极少数的情况下,为了从最大限度减少代码赋值的前提下考虑,是可以使用跨窗口绑定。
比如窗口A中有一个控件XA,B窗口中有个YB控件,我希望把A中的XA控件的Text属性与B中的YB控件的Item属性进行绑定。绑定后的好处在于,当Item属性更新后,会自动修改Text属性,而不需要额外写代码去监视各控件属性的更改。因为高境界程序员向来都是以最少的代码做最多的事情。
然而,在默认情况下,一个窗口的代码是不能访问另一个窗口中的控件的,XAML文档中声明的控件变量默认的访问方式为private。为了解决这一局限,XAML的扩展标记中提供了FieldModifier扩展,可以修改XAML文档中声明对象的访问方式。比如这样:
<TextBlock Name="tbtxt" x:FieldModifier="public" />
通过设置x:FieldModifier="public",使得名为tbtxt的TextBlock控件会被生成为public字段,这么一来,其他的窗口就可以访问该控件了。
只有解决了上述问题,才能实现控件的跨窗口绑定。
为了使本文的内容变得生动活泼,充满青春活力,接下来老周会举一个500年不遇的简单例子。
本示例包含两个窗口,主窗口为MainWindow类,外加一个自定义窗口MyDialog(当作自定义对话框)。主窗口中有一个TextBlock控件和一个Button控件,当点击按钮后会打开MyDialog对话框,对话框中有一个ComboBox控件,当用户在ComboBox控件中选择项时,会同步更新主窗口中TextBlock的显示文本。
即,将MainWindow.TextBlock对象的Text属性和MyDialog中的ComboBox控件的SelectedItem属性进行绑定。Text属性自动从SelectedItem属性中取值。
为了让MyDialog窗口能够访问主窗口中的TextBlock对象,所以XAML要这样写:
<TextBlock Name="tbtxt" x:FieldModifier="public" Margin="10"/>
<Button Content="打开对话框" Click="OnOpenDialog"/>
然后,设计MyDialog的界面,声明ComboBox对象,并添加几个选项。
<ComboBox Name="cmb" >
<sys:String>飞机</sys:String>
<sys:String>坦克</sys:String>
<sys:String>火车</sys:String>
<sys:String>轮船</sys:String>
<sys:String>大卡车</sys:String>
<sys:String>拖拉机</sys:String>
<sys:String>装甲车</sys:String>
</ComboBox>
<Button HorizontalAlignment="Center" Grid.Row="1" Margin="0,20" Content="OK" Click="OnClick"/>
接着,在MyDialog类的构造函数中通过代码来设置Binding。
public MyDialog(Window owner)
{
this.Owner = owner;
InitializeComponent(); // 设置Binding对象
Binding b = new Binding();
b.Path = new PropertyPath(ComboBox.SelectedItemProperty);
b.Source = cmb;
b.Mode = BindingMode.OneWay;
b.StringFormat = "您选择的交通工具为:{0}"; MainWindow mw = Owner as MainWindow;
// 使属性与Binding关联
mw?.tbtxt.SetBinding(TextBlock.TextProperty, b);
}
Window类有一个Owner属性,可以设置它的父窗口,这里,MyDialog作为弹出窗口,MainWindow作为父窗口,因此在实例化MyDialog时传递owner,使得代码能访问MainWindow。我这里为了方便省事,直接写了个带参数的构造函数。
注意此处的绑定,数据源是ComboBox控件,数据使用者是TextBlock,所以Binding的Source应为cmb实例,Path直接用依赖项属性标识即可。
最后调用TextBlock对象的SetBinding方法就可以设置Binding了。
为啥不用XAML来binding呢,因为这是跨窗口的绑定,用XAML很难写,用代码来写反而好处理。
运行程序,然后打开对话框,在对话框中选一个项,你会看到,父窗口中的显示文本会自动更新。
准确地说,本文内容不算是什么高科技,纯粹是一种技巧运用吧。示例不需要多复杂,只要能起到演示效果就行,老周天生讨厌把事情复杂化,所以老周的座右铭是:
非Easy无以致学,非实战无以Code。
【.NET深呼吸】(WPF)跨窗口完成绑定的更多相关文章
- WPF 程序如何跨窗口/跨进程设置控件焦点
原文:WPF 程序如何跨窗口/跨进程设置控件焦点 WPF 程序提供了 Focus 方法和 TraversalRequest 来在 WPF 焦点范围内转移焦点.但如果 WPF 窗口中嵌入了其他框架的 U ...
- WPF 在事件中绑定命令(不可以在模版中绑定命令)
其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...
- WPF 在事件中绑定命令
导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...
- WPF中,如何将绑定源设置到单件实例
原文:WPF中,如何将绑定源设置到单件实例 WPF中,如何将绑定源设置到单件实例 周银辉 大概两个月前,曾有位朋友问我:如 ...
- WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...
- 官宣|VS Code 1.59 发布!Terminal 可以跨窗口移动了!
欢迎使用 2021 年 7 月版的 Visual Studio Code.我们希望您会喜欢此版本中的许多更新与改进,以下是其中的一些高亮: 扩展视图的改进 - 丰富的扩展详细信息悬停,新的运行状态标签 ...
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- appcan 跨窗口处理方法 appcan.window.evaluateScript({name,scriptContent,type})使用解读
appcan.window.evaluateScript({ name,/*主窗口名称,此窗口要先用appcan.window.open打开了,才能找到,此方法才会有效*/ scriptContent ...
随机推荐
- 学习AOP之深入一点Spring Aop
上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...
- 【XSS】延长 XSS 生命期
XSS 的本质仍是一段脚本.和其他文档元素一样,页面关了一切都销毁.除非能将脚本蔓延到页面以外的地方,那样才能获得更长的生命力. 庆幸的是,从 DOM 诞生的那一天起,就已为我们准备了这个特殊的功能, ...
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- JavaScript Date对象
本篇主要介绍 Date 日期和时间对象的操作. 目录 1. 介绍:阐述 Date 对象. 2. 构造函数:介绍 Date 对象的构造函数new Date()几种方式. 3. 实例方法:介绍 Date ...
- HTML DOM 介绍
本篇主要介绍DOM内容.DOM 节点.节点属性以及获取HTML元素的方法. 目录 1. 介绍 DOM:介绍DOM,以及对DOM分类和功能的说明. 2. DOM 节点:介绍DOM节点分类和节点层次. 3 ...
- dedecms 后台栏目添加图片
前台调用栏目时需要显示图标,整理一下: 第一步:“系统->SQL命令工具” , 插入sql语句 alter table dede_arctype add typeimg varchar() 第二 ...
- 反应器(Reactor)和主动器(Proactor)
网络方面用的比较多的库是libevent和boost.asio,两者都是跨平台的.其中libevent是基于Reactor实现的,而boost.asio是基于Proactor实现的.Reactor和P ...
- CSS中强悍的相对单位之em(em-and-elastic-layouts)学习小记
使用相对单位em注意点 1.浏览器默认字体是16px,即1em = 16px,根元素设置如下 html{ font-size: 100%; /* WinIE text resize correctio ...
- iOS之判断手机号码、邮箱格式是否正确
//判断手机号码格式是否正确 + (BOOL)valiMobile:(NSString *)mobile{ mobile = [mobile stringByReplacingOccurren ...
- 面向未来的友好设计:Future Friendly
一年前翻译了本文的一部分,最近终于翻译完成.虽然此设计思想的提出已经好几年了,但是还是觉得应该在国内推广一下,让大家知道“内容策略”,“移动优先”,“响应式设计”,“原子设计”等设计思想和技术的根源. ...