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

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

大概两个月前,曾有位朋友问我:如果我想在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.WidthSystemParameters.WorkArea.Height上的,但其发现用户更改了工作区大小(比如将任务栏拖高一些,工作区就变小了)后,窗口却不知道这事而无法及时调整自身大小来适合新的工作区大小.这里需要说明的是,我们对应静态数据的引用常常会写成下面这种方式:
{x:Static SystemColors.WindowBrush},这是有效的,但当WindowBrush值发生变化后,你的应用是不会随之改变的
正确的方式是:
{DynamicResource {x:Static SystemColors.WindowBrush}}

目录
相关文章
WPF—多重绑定和跨层级绑定
WPF—多重绑定和跨层级绑定
|
3月前
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
214 1
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8431 0
|
C# 数据库
WPF中DataGrid控件绑定数据源
WPF中DataGrid控件绑定数据源
176 0
|
C#
WPF更新绑定字段
WPF更新绑定字段
102 0
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
WPF中给TextBox/TextBlock设置提示文本
|
前端开发 C#
WPF 之 数据与命令绑定 (MVVM方式)
WPF 之 数据与命令绑定 (MVVM方式)
197 0
WPF 之 数据与命令绑定 (MVVM方式)
WPF界面异常:未将对象引用设置到对象实例
WPF界面异常:未将对象引用设置到对象实例
WPF TreeView设置所有节点默认展开
WPF TreeView设置所有节点默认展开
|
C# 前端开发
WPF中的多进程(Threading)处理实例(一)
原文:WPF中的多进程(Threading)处理实例(一) 说明:希望通过揣摩这些案例,能进一步了解进程的工作原理。 1.方法一描述的是在同一窗口中,在计算素数的同时而不影响Canvas的工作。 方法1 1 #region Long-Running Calculat...
1580 0