上次老周介绍了在 UWP 应用中通过 x:Bind 标记来绑定到方法,以实现实时获取计算结果。今天,咱们来耍耍WPF上面的实现方法。

虽然,WPF 没有 x:Bind 标记(暂时没有,以后不好说),但 WPF 在数据绑定方面也是有很强大的引擎D,毕竟它是 .net 框架一部分。其实,当年在 .net 1.x 的时候,老周就推测微软会推出新的框架的,只是当时还不知道它叫 WPF,为啥呢。因为当时老周发现,Windows 窗体应用相关的类型都放在 System.Windows.Forms 命名空间下,不知道你初学.net 时会不会感到很奇怪,反正老周觉得很怪,为什么不直接放到 System.Windows 命名空间下呢,所以,我就想到,System.Windows 命名空间下将来肯定要放别的东西。

后来,.net 2.0 SP1,.net 3.0,尤其是 .net 3.5 的时候,这个框架逐步定型,故我一直认为 4.0 是.net 成熟的标志。

好了,不上历史课了,咱们还是继续上编程课吧。

在 WPF 中,提供了一种很好玩的绑定模型——DataSourceProvider,当然,它是抽象类,不能直接用的,直接用的话会抽风。它的派生类为我们实现了两种形式的“间接绑定”:XmlDataProvider 可以组件或链接外部的XML文档;ObjectDataProvider可以绑定到某个类型或该类型的实例对象,而且还可以绑定到类型的方法成员上,实例方法或是静态方法皆可。

要实时获取计算结果,应当使用 ObjectDataProvider 类,如果要绑定实例方法,除了要为 ObjectType 属性设定目标类型的Type外,还要将该类型的实例赋给 ObjectInstance 属性;如果是绑定到静态方法,那就不必要指定 ObjectInstance 属性了。

然后,通过 MethodName 属性设置要绑定的方法的名字,如果方法有参数,向 MethodParameters 列表添加元素,有几个参数就传几个值,元素的顺序与方法参数的声明一致即可。注意这个方法要有返回值,因为绑定目标要从该方法获取计算结果的。

下面咱们用一个示例来说明一下。

首先,得声明一个类,用来进行计算,我就用一个静态方法吧,简单方便。

    public class Demo
{
public static double GetMin(double a, double b)
{
return Math.Min(a, b);
}
}

这个方法很简单,幼儿园层次的,输入两个数值,返回其中较小的值。

然后,重点来了,在 XAML 文档中声明 ObjectDataProvider 实例。

        <Grid.Resources>
<local:StrAndDoubleConverter x:Key="cvt"/>
<ObjectDataProvider x:Key="dprd" ObjectType="{x:Type local:Demo}"
MethodName="GetMin">
<ObjectDataProvider.MethodParameters>
<sys:Double>0</sys:Double>
<sys:Double>0</sys:Double>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Grid.Resources>

StrAndDoubleConverter 是一个自定义的转换器,在 string 和 double 之间转化,这个大家可以无视。

ObjectType 属性指定的是我们刚刚定义的 Demo 类,MethodName 方法指定刚刚那个静态方法。由于这个方法需要两个输入参数,所以,得向 MethodParameters 中添加两个 double 值,默认全设为 0。

下面我们在 UI 上放两个 TextBox 控件,用来输入两数值,并且当输入的值改变时,自动把值传递到 ObjectDataProvider 对象的 MethodParameters 列表中。如何实现呢?数据绑定,把 TextBox 的 Text 属性与 MethodParameters 中的元素进行绑定,并且是双向绑定。

            <TextBox Grid.Row="0" Grid.Column="1" Margin="4" Text="{Binding Source={StaticResource dprd},BindsDirectlyToSource=True,Mode=TwoWay,Path=MethodParameters[0],Converter={StaticResource cvt},UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Grid.Row="1" Grid.Column="1" Margin="4" Text="{Binding Source={StaticResource dprd},BindsDirectlyToSource=True,Mode=TwoWay,Path=MethodParameters[1],Converter={StaticResource cvt},UpdateSourceTrigger=PropertyChanged}"/>

此处, BindsDirectlyToSource 属性记得要设置为 true,这个是啥意思呢?它的意思就是,这个Binding是直接绑定到 Source 属性所指定的对象,还是原始数据源。在本例这个绑定模型中,原始数据源应为 Demo 类,而中间数据源是 ObjectDataProvider 对象,因此,如果不把 BindsDirectlyToSource 属性设置为true,那么这个 Binding 所相对的是 Demo 类,如果 BindsDirectlyToSource 属性为 true,那么该Binding的相对源就会指向 ObjectDataProvider 对象,这样一来,Path 属性才能找到 MethodParameters 列表中的元素。

其中,[0] 表示列表中的第一个元素,即传给绑定方法的第一个参数,同理,[1] 就是指向第二个参数。为了能够在 Text 属性更改时更新方法参数,需要设置 UpdateSourceTrigger=PropertyChanged,Mode=TwoWay。

接着,我们声明一个 TextBlock 元素,同样也是绑定到前面在资源中声明的 ObjectDataProvider 对象上,实时获取计算的结果。

        <TextBlock Grid.Row="1" Margin="5">
<Run Text="较小的那个数:"/>
<Run Text="{Binding Source={StaticResource dprd},Mode=OneWay}" Foreground="DarkGreen" FontSize="18"/>
</TextBlock>

这里只需要读取结果即可,所以,Mode 为 OneWay 即可。如果计算需要花较长时间,可以设置 IsAsynchronous 属性为 true,这样可以优化 UI 的响应速度。

好了,示例完成了,咱们来看看运行效果吧。

而后,老周尝试把方法的返回值改为 void,以 out 和 ref 方式进行计算结果赋值,但绑定后不能获得正确的结果。

示例源代码下载请点击这里

【.net 深呼吸】实时获取计算结果的更多相关文章

  1. Storm分布式实时流计算框架相关技术总结

    Storm分布式实时流计算框架相关技术总结 Storm作为一个开源的分布式实时流计算框架,其内部实现使用了一些常用的技术,这里是对这些技术及其在Storm中作用的概括介绍.以此为基础,后续再深入了解S ...

  2. GPS(2)关于位置的3个示例,实时获取GPS定位数据,求两个经纬点距离,邻近某个区域圆时警告

    实时获取GPS定位数据 import android.app.Activity; import android.content.Context; import android.location.Loc ...

  3. .Spark Streaming(上)--实时流计算Spark Streaming原理介

    Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍 http://www.cnblogs.com/shishanyuan/p/474 ...

  4. Storm概念学习系列之什么是实时流计算?

    不多说,直接上干货! 什么是实时流计算?    1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...

  5. 实时获取股票数据,免费!——Python爬虫Sina Stock实战

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 实时股票数据的重要性 对于四大可交易资产:股票.期货.期权.数字货币来说,期货.期权.数字货币,可以从交 ...

  6. geotrellis使用(二十二)实时获取点状目标对应的栅格数据值

    目录 前言 实现方法 总结 一.前言        其实这个功能之前已经实现,今天将其采用1.0版的方式进行了重构与完善,现将该内容进行总结.        其实这个功能很常见,比如google地球上 ...

  7. Android网络开发之实时获取最新数据

    在实际开发中更多的是需要我们实时获取最新数据,比如道路流量.实时天气信息等,这时就需要通过一个线程来控制视图的更新. 示例:我们首先创建一个网页来显示系统当前的时间,然后在Android程序中每隔5秒 ...

  8. WINDOWS黑客基础(5):利用内存来进行获取计算结果

    在前面的注入代码的章节中,我们利用了VirtualAllocEx来在对方的进程开辟了一块内存,并且将代码复制进对方进程的内存里面,从而执行那段内存的代码,但是这里有一个问题,就是代码不是执行在我们进程 ...

  9. 用angular实时获取本地localStorage数据,实现一个模拟后台数据登入的效果

    研究了一上午,终于做出了,实时获取本地localStorage来模拟注册登入~~~ <!DOCTYPE html><html><head lang="en&qu ...

随机推荐

  1. Java并发编程笔记——技术点汇总

    目录 · 线程安全 · 线程安全的实现方法 · 互斥同步 · 非阻塞同步 · 无同步 · volatile关键字 · 线程间通信 · Object.wait()方法 · Object.notify() ...

  2. (转)@ContextConfiguration注解说明

    场景:学习spring实战中相关的单元测试 1 正常使用 @ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件 1.1 单个文件 @ContextC ...

  3. (转)xml

    1  XML理论回顾 1.1 XML概述 1.XML是可扩展标记语言.是由W3C指定并维护的,目前最新的版本是1.0 2.XML作用: 2.1传输数据,它是一种通用的数据交换格式 2.2配置文件. 1 ...

  4. .net 自动分类算法【原创】

    目前自动分类算法是参考网上的思路和想法个人自主研发的. 当然互联网上有很多人采用不同的方式去解决自动分类问题,也有不同的算法和论文支持去做,但纵观自动分类这块工作是属于机器学习这块工作内容,总结出来比 ...

  5. Linux系统7个运行级别(runlevel)(转)

    原文地址:http://www.cnblogs.com/dkblog/archive/2011/08/30/2160191.html Linux系统有7个运行级别(runlevel) 运行级别0:系统 ...

  6. jdk配置java_home的两种方式

    在开发java项目的时候,要先安装jdk,安装完jdk之后我们要配置环境变量.今天说一下java home环境变量. 配置环境变量有两种方式,一种就是在计算机的环境变量里面配置.这个是很简单的.如果你 ...

  7. HDU1027 Ignatius and the Princess II

    Problem Description Now our hero finds the door to the BEelzebub feng5166. He opens the door and fin ...

  8. 初学django搭建一个通讯录应用

    ---恢复内容开始--- django搭建一个通讯录应用 一.环境介绍 window10 64位 Django-1.5.12 python 2.7 Sqlite3 二.基本安装 python2.7安装 ...

  9. 分布式web架构中对session同步的常用处理方法以及优缺点

    写在前面 最近在读一本来自淘宝技术团队大牛的书,名字叫<大型网站系统与Java中间件实践>.开篇的章节详细地介绍了一个网站架构由小变大不断演进的过程,其中从单机架构升级到集群架构的过程中着 ...

  10. golang 之验证码api

    知识一:如何返回一个json数据? 先定义一个结构体ResponseData,2个参数,并返回的是json数据,key就是json后定义的名称 type ResponseData struct { S ...