上次老周介绍了在 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. [补] winpcap编程——EAPSOCKET实现校园网锐捷登录(mentohust)

    EAP SOCKET Implement Mentohust 时间20161115 对于EAP协议不了解,可参考上一篇随笔. 通过抓包分析校园网的锐捷登录流程,我在上一篇随笔中实现了EAPSOCKET ...

  2. Spring源码情操陶冶-AbstractApplicationContext#prepareRefresh

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-AbstractApplicationContext 约束: 本文指定contextClass为默认的XmlWebApplicati ...

  3. ThreadLocal源码分析(转)

    阅读总结: ThreadLocal内部使用静态map存储,每个变量对应一个hashcode,不需要指定key值,后台动态生成,good! 每个变量ThreadLocal内部分配Entry,获取值时,通 ...

  4. 封装自己的Ajax框架

    Ajax技术就是利用javascript和xml实现异步交互的功能. 首先先来介绍一下Ajax相关知识点 一.Ajax对象的创建 1.创建Ajax对象的方式 a.第一种方式是针对IE浏览器 b.第二种 ...

  5. 全站 HTTPS 没你想象的那么简单

    对自己无知这件事本身的无知真的挺可怕 认知偏差现象一直存在于我们每个人身上,谁也避免不掉,不过是有的人了解这件事儿,有的人不怎么知道而已,这就产生了「无知而不自知」的认知偏差.当然,这时候你自己忽悠自 ...

  6. (4)UIView和父子控件

    IButton控件中除了有自身的属性之外还有继承的view的属性 内存地址一样,是同一个view来的,也就是最外层的view.

  7. Aspose.Words关于域的应用

    #region 通过word域去插入相应的数据 /// <summary> /// 通过word域去进行指定位置替换数据 /// </summary> public void ...

  8. NYOJ--1276--机器设备(河南省第九届省赛,简单的bfs)

    机器设备 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Alpha 公司设计出一种节能的机器设备.它的内部结构是由 N 个齿轮组成.整个机器设备有 一个驱动齿轮,当 ...

  9. POJ 2593 Max Sequence

    Max Sequence Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17678   Accepted: 7401 Des ...

  10. mycat学习心得

    最近老大要求我们学习mycat,并运用到实际项目中.现在简单分享下自己的学习心得,也算是只是积累吧. 什么是mycat? 用我的话理解就是:mycat是一种技术,采用mycat后可以提高程序的速度,也 ...