WPF中,如何将绑定源设置到单件实例
 WPF中,如何将绑定源设置到单件实例
                                      周银辉
大概两个月前,曾有位朋友问我:如果我想在WPF中将绑定源设置到某个采用单件模式设计的实例上,应该怎么做呢?这是一个不错的问题.可能这段时间比较忙,呵呵,忘记回答这个问题了,昨天拿到伍迷大哥的《大话设计模式》(PS:强烈推荐该书哈,真的不错)时突然想起这个问题了.今天简要说一下:
首先我们简单地写一个使用了单件模式的MyButton类:
    public class MyButton : Button
    
{
        private MyButton()
        
{
            this.Content = "hahhaha, it's me";
        }
        private static MyButton instance = new MyButton();
        public static MyButton Instance
        
{
            get
            
{
                return instance;
            }
        }
        //public static MyButton GetInstance()
        //{
        //    return instance;
        //}
    }
}OK,我们不讨论设计模式,我们讨论针对不同的单例提供方式,我们在XAML中如何使用它,这里所说的"单例提供方式"是指,要么是使用上面的Instance只读属性方式提供,或是使用GetInstance()方法(上面被注释掉的部分)来提供给客户程序.
要如何实现下面的功能:
        <Label Content="{绑定到MyButton的单件实例上(即Instance)}"/>
        <TextBox Text="{绑定到MyButton的单件实例上(即Instance)},Path=Content,
                 Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
1,若是使用属性方式提供:
这比较简单,你只需要了解x:Static标记就足够了.它负责对静态数据的引用.   
首先,在Xaml代码中加入我们的名字空间:
xmlns:local="clr-namespace:WpfApplication3"    然后,这样使用就OK:
<TextBox Text="{Binding Source={x:Static local:MyButton.Instance},Path=Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>看看效果吧:

改变下面文本框的文本,上面按钮上的文本也会随之改变,都是引用到同一个单例嘛:)
2,若是使用方法方式提供:
即采用下面的方式提供的
        public static MyButton GetInstance()
        
{
            return instance;
        }有可能这个单例类根本就不是你设计的,没有理由让人家将方法改成属性哈,没关系的,同样可以轻松解决.但你得了解在WPF中如何绑定到方法.
OK,我们在资源字典中添加一个如下的ObjectDataProvider:
    <Window.Resources>
        <ObjectDataProvider x:Key="myButtonKey" ObjectType="{x:Type local:MyButton}" MethodName="GetInstance"/>
    </Window.Resources>其将从MyButton类中的GetInstance方法的返回值取得对象,然后我们就可以像使用普通资源一样使用它了:
<TextBox Text="{Binding Source={StaticResource myButtonKey},Path=Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>效果图就不必看了哈,和上面的图一模一样.
另外:说到x:Static,另起一个问题:操作系统给我们提供很多资源,比如:桌面工作区的大小,系统颜色等,应该如何跟踪这些值呢.以前我的一个同事遇到这样一个问题,其应用程序主窗口铺满整个桌面工作区,但该窗口没有边框,其将窗口大小绑定到SystemParameters.WorkArea.Width和SystemParameters.WorkArea.Height上的,但其发现用户更改了工作区大小(比如将任务栏拖高一些,工作区就变小了)后,窗口却不知道这事而无法及时调整自身大小来适合新的工作区大小.这里需要说明的是,我们对应静态数据的引用常常会写成下面这种方式:
{x:Static SystemColors.WindowBrush},这是有效的,但当WindowBrush值发生变化后,你的应用是不会随之改变的
正确的方式是:
{DynamicResource {x:Static SystemColors.WindowBrush}}
WPF中,如何将绑定源设置到单件实例的更多相关文章
- 总结:WPF中模板需要绑定父级别的ViewModel该如何处理
		
原文:总结:WPF中模板需要绑定父级别的ViewModel该如何处理 <ListBox ItemsSource="{Binding ClassCollection}"> ...
 - WPF中DatePiker值绑定以及精简查询
		
WPF中DatePiker值绑定以及精简查询 1.WPF中DatePiker值绑定 Xaml中值绑定使用Text <DatePicker Text="{Binding strMinDa ...
 - Csc”任务不支持“SharedCompilationId”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性
		
今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...
 - UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
		
UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务.“CompileXaml”任务不支持“PlatformXmlDir”参数.请确认该参数存在于此任务中,并且是可设置的 ...
 - WPF中ListBox的绑定
		
WPF中列表式控件派生自ItemsControl类,继承了ItemsSource属性.ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都 ...
 - WPF 使用XML作为绑定源时Xaml注意事项
		
直接在xaml定义时xml时应该注意的! xml数据 <?xml version="1.0" encoding="utf-8"?> <Stri ...
 - wpf中的datagrid绑定操作按钮是否显示或者隐藏
		
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了. 但是在wpf里不行..网上 ...
 - WPF中使用ObjectDataProvider绑定方法
		
ObjectDataProvider提供了绑定任意.net类型的功能,具体功能如下: 1.ObjectDataProvider提供了绑定任意CLR类型的公嫩那个. 2.它可以再XAML中利用生命史的语 ...
 - wpf 中的DataTemplate 绑定控件
		
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...
 
随机推荐
- spring-4.3.16+xfire-spring-1.2.6版本升级
			
最近爆了个spring的漏洞,然后公司整体要求升级spring到最新版本,然后搞四了一大批猿人. spring-4.*的最新版本是4.3.16(稳定版) xfire-spring-1.2.6(最新版- ...
 - 了解git /github
			
一 GIT是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git ...
 - One Order行项目里Item Category是怎么计算出来的
			
One Order的行项目里有个字段叫Item Category,我们在行项目里加入一个product后,就会自动带出Item Category来.这个值是怎么计算出来的? 检查CRMD_ORDERA ...
 - angular2 里父子组件传值的坑
			
1.如果传的是基本类型的值,子组件里改变该值,父组件无变化 2.如果传的是对象,子组件里改变对象里的变量,父组件会变化 3.如果传的是函数,this不会继续指向父组件对象了,如果需要this指向父组件 ...
 - jquery.dataTables列中内容居中问题?求解?
			
.table > tbody > tr > td { vertical-align: middle; }
 - HDU 2686 MCMF
			
题意:两遍最长路,不能走重复点.和UVA 10806类似. 分析:拆点,u->u',MCMF,求的是最大流的最小费用,那么cost取负. 注意的是源点,源点不用拆,那么走出来的最小费用,左上角的 ...
 - winform 实现彩票功能
			
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/MrTraum/article/details/32702319 watermark/2/text/a ...
 - jmeter报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported"的解决方法
			
1.报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supporte ...
 - Visual Studio 2010 RDLC 报表简单使用
			
原文:Visual Studio 2010 RDLC 报表简单使用 RDLC(Report Definition Language Client-side Processing)是Visual Stu ...
 - ES6学习笔记(对象)
			
1.属性的简洁表示法 const foo = 'bar'; const baz = {foo}; baz // {foo: "bar"} // 等同于 const baz = {f ...