原文: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中,如何将绑定源设置到单件实例的更多相关文章

  1. 总结:WPF中模板需要绑定父级别的ViewModel该如何处理

    原文:总结:WPF中模板需要绑定父级别的ViewModel该如何处理 <ListBox ItemsSource="{Binding ClassCollection}"> ...

  2. WPF中DatePiker值绑定以及精简查询

    WPF中DatePiker值绑定以及精简查询 1.WPF中DatePiker值绑定 Xaml中值绑定使用Text <DatePicker Text="{Binding strMinDa ...

  3. Csc”任务不支持“SharedCompilationId”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性

    今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...

  4. UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。

    UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务.“CompileXaml”任务不支持“PlatformXmlDir”参数.请确认该参数存在于此任务中,并且是可设置的 ...

  5. WPF中ListBox的绑定

    WPF中列表式控件派生自ItemsControl类,继承了ItemsSource属性.ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都 ...

  6. WPF 使用XML作为绑定源时Xaml注意事项

    直接在xaml定义时xml时应该注意的! xml数据 <?xml version="1.0" encoding="utf-8"?> <Stri ...

  7. wpf中的datagrid绑定操作按钮是否显示或者隐藏

    如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了. 但是在wpf里不行..网上 ...

  8. WPF中使用ObjectDataProvider绑定方法

    ObjectDataProvider提供了绑定任意.net类型的功能,具体功能如下: 1.ObjectDataProvider提供了绑定任意CLR类型的公嫩那个. 2.它可以再XAML中利用生命史的语 ...

  9. wpf 中的DataTemplate 绑定控件

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

随机推荐

  1. June 17th 2017 Week 24th Saturday

    Absence sharpens love, presence strengthens it. 相聚爱益切,离别情更深. There is almost no such love that can i ...

  2. 第一次使用Git

    这次的作业是关于GIT的,一开始我并不知道GIT是啥,百度了一下才知道Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds ...

  3. IOS ASI和AFN的 区别

    一.底层实现 1> AFN的底层基于OC的NSURLConnection和NSURLSession2> ASI的底层基于纯C语言的CFNetwork框架3> ASI的运行性能 高于 ...

  4. linux下修改apt下载源

    很多时候使用apt install命令会出现Unable to fetch somearchives的错误,我们需要运行以下apt update,可是经常会出现下载速度很慢的情况 这里就记一下将apt ...

  5. 命令式编程 vs 声明式编程

    实际上我们绝大多数程序员都是在用命令式风格在编程, 这是和我们的冯诺依曼计算机机构密切相关的. (码农翻身注: 参见文章<冯诺依曼计算机的诞生>) 在一个冯诺依曼计算机中, 最核心的就是C ...

  6. bpexpdate – 更改映像目录库中备份的截止日期以及介质目录库中介质的截止日期nbu

    1.根据bpdbjobs查找backupidbpdbjobs -jobid xxx -all_columns|grep backupid 2.查看数据保留时间[root@backup]# bpimag ...

  7. Spring多个版本源码地址分享

    源码地址为:http://repo.spring.io/simple/libs-release-local/org/springframework/spring/,以供研究源码的朋友. 我看了好几本关 ...

  8. Mac使用GNU版本的sed

    今天在mac下用sed试图替换\t ,结果发现不生效,Google之后发现mac作为unix分支的系统上的sed与GNU版本的sed行为不太一致. 使用以下命令安装GNU命令套件: brew inst ...

  9. JavaScript函数-高阶函数

    JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数. function add(x,y,f) ...

  10. mysql的子查询in()操作及按指定顺序显示

    代码示例: in(逗号分隔开的值列表) 释:是否存在于值列表中 --------------------- 示例: select * from test where id in(3,1,5) orde ...