艾伟: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()方法(上面被注释掉的部分)来提供给客户程序.

要如何实现下面的功能:
        绑定到MyButton的单件实例上(即Instance)}"/>
        绑定到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}}

时间: 2024-09-30 07:46:16

艾伟:WPF中,如何将绑定源设置到单件实例的相关文章

WPF中,如何将绑定源设置到单件实例

大概两个月前,曾有位朋友问我:如果我想在WPF中将绑定源设置到某个采用单件模式设计的实例上,应该怎么做呢?这是一个不错的问题.可能这段时间比较忙,呵呵,忘记回答这个问题了,昨天拿到伍迷大哥的<大话设计模式>(PS:强烈推荐该书哈,真的不错)时突然想起这个问题了.今天简要说一下: 首先我们简单地写一个使用了单件模式的MyButton类: public class MyButton : Button     {         private MyButton()         {       

Android中ViewFlipper的使用及设置动画效果实例详解_Android

本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

Android中ViewFlipper的使用及设置动画效果实例详解

本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

WPF中根据文本内容自动设置大小的RichTextBox

很怀念windows forms当中的AutoSize属性啊,但可惜的是WPF并没有实现这个属性,这多少让人有些郁闷. 那就自个写吧,相对比较容易的是TextBox之类的仅仅显示平文本的控件,你 可以根据你的文本,字体等等属性构造一个FormattedText 实例,这个实例有Width/Height属性(我还是很怀念Font.MeasureString方 法),最让人纠结的是RichTextBox控件,哎,又是它. 思路很简单,监视文本变化,文本变化时调整控件大小: protected ove

求高人wpf中Richtextbox通过代码来设置给选中文字加下划线

问题描述 //通过代码来设置选中文字的样式代码:RichTextBox1.Selection.ApplyPropertyValue(TextElement.ForegroundProperty,Brushes.Red);//改变前景色RichTextBox1.Selection.ApplyPropertyValue(TextElement.FontSizeProperty,12);//改变文字大小上面是改变颜色和字体,怎么加下划线,还有一个问题是,当这些样式设置了以后,如果继续输入时文字会变成上

IIS7中web.config给EMLOG设置伪静态规则实例

今天看到论坛上有一位小盆友不会弄IIS7环境下的EMLOG伪静态规则,于是骚包就分享给大家一下这个伪静态规则的代码:  代码如下 复制代码 <?xml version="1.0" encoding="UTF-8"?> <configuration>     <system.webServer>         <rewrite>             <rules>                 <

在WordPress中使用wp-cron插件来设置定时任务_php实例

PHP 本身是无法创建定时任务的,但是 WordPress 自带了一个伪定时任务(Cron) API,非常的方便好用,包括 WordPress 本身的定时发布文章都依赖于这个 API WP Cron 是什么? 是 WordPress 一套定时触发机制, 可以循环安排任务执行. 如: 定时发布新文章, 定期检测版本等功能都是通过这个来实现的. WP Cron 可以为我们实现什么? 我们可以循环更新和提交网站数据, 节日定期向读者发送贺卡或者表单 ... 它的原理就是将创建的定时任务存储到数据库里,

艾伟:WPF中的Style(风格,样式)

在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作为一种资源被保存下来的. 看下面的例子:  <Window.Resources>       <Style TargetType="Button">      <Setter Property="Foreg

WPF中的Style(风格,样式)

在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作为一种资源被保存下来的. 看下面的例子: <Window.Resources>        <Style TargetType="Button">       <Setter Property="Fore