WPF实例秀——不用属性也Binding

简介:
正文:
实际编程中,因为我们较多地使用到Binding类的Source与Path,所以可能会有一个思维定式,那就是:有可能作为数据源的类一定要准备好一些属性,这些属性将作为Binding的Path。
如果本着这个思想去设计有可能作为数据源的类,那么会有两个问题出现:
1. 这个类的哪些属性有可能作为数据源的Path?是都需要激发NotifyPropertyChanged事件,还是用到了再添加?这很有可能让这个类迟迟不能封闭。
2. 需要用属性把一些方法包装起来,用来暴露给Binding,造成冗余和语义上的不美观。
其实,WPF类库里有一个名为ObjectDataProvider的类就是专门为了解决这个矛盾的——有了这个类,你在设计自己的类的时候就不必总想着把它设计成数据源的事儿了,该怎么抽象就怎么抽象、该怎么封装就怎么封装。
你可能会问:“如果这个类已经封闭了(不再改动)而我又需要拿它当数据源了,碰巧所需要的数据是它某个方法的返回值,没有对应属性,怎么办?”OK,这就是ObjectDataProvider的用武之地了——使用它,可以在你这个类的实例外面加上一层“包装”(或者说是加个壳儿),使它变成一个标准的Binding数据源。 如果没记错的话,这应该是著名的“适配器模式”
 
下面,我们用一段简单的代码来学习如何使用ObjectDataProvider。
 
这个例子简单到不能再简单——三个TextBox,在前两个里输入合适的数字,在第三个里会显示它们的和。按照UI与逻辑分开的原则,计算加法的功能应该由某个类来实现。
 
后台负责计算的类是这样:
  1.     public class Calculator
  2.     {
  3.         public int Add(int arg1, int arg2)
  4.         {
  5.             return arg1 + arg2;
  6.         }
  7.         public string Add(string arg1, string arg2)
  8.         {
  9.             int x = 0;
  10.             int y = 0;
  11.             if (int.TryParse(arg1, out x) && int.TryParse(arg2, out y))
  12.             {
  13.                 return this.Add(x, y).ToString();
  14.             }
  15.             else
  16.             {
  17.                 return "Input Error!";
  18.             }
  19.         }
  20.     }
大家看到了,设计这个类的时候,涉及到加法运算的逻辑时,任何一个程序员都会很自然地采用一个方法来实现,而不会为了把它做成一个Binding的数据源专门把这些方法封装进属性里——这样就破坏了面向对象的抽象。
 
然后,让我们看看如何使用ObjectDataProvider来包装这个类。
 
  1. <Window x:Class="WpfApplicationAdd.Window1"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:local="clr-namespace:WpfApplicationAdd"
  5.         xmlns:system="clr-namespace:System;assembly=mscorlib"
  6.     Title="Add" Height="136" Width="230" Background="SteelBlue">
  7.     <Window.Resources>
  8.         <ObjectDataProvider x:Key="odp" ObjectType="{x:Type local:Calculator}" MethodName="Add">
  9.             <ObjectDataProvider.MethodParameters>
  10.                 <system:String>0</system:String>
  11.                 <system:String>0</system:String>
  12.             </ObjectDataProvider.MethodParameters>
  13.         </ObjectDataProvider>
  14.     </Window.Resources>
  15.     <StackPanel>
  16.         <TextBox x:Name="textBox1" Margin="5" Text="{Binding Source={StaticResource odp}, Path=MethodParameters[0], BindsDirectlyToSource=true, UpdateSourceTrigger=PropertyChanged}" />
  17.         <TextBox x:Name="textBox2" Margin="5" Text="{Binding Source={StaticResource odp}, Path=MethodParameters[1], BindsDirectlyToSource=true, UpdateSourceTrigger=PropertyChanged}"/>
  18.         <TextBox x:Name="textBox3" Margin="5" Text="{Binding Source={StaticResource odp}, Mode=OneWay}"/>
  19.     </StackPanel>
  20. </Window>
运行起来之后,你就能看到这样的结果了:
 




本文转自 水之真谛 51CTO博客,原文链接:http://blog.51cto.com/liutiemeng/121349,如需转载请自行联系原作者
目录
相关文章
|
9月前
|
存储 自然语言处理 C#
WPF技术之Binding
WPF(Windows Presentation Foundation)是微软推出的一种用于创建应用程序用户界面的框架。Binding(绑定)是WPF中的一个重要概念,它用于在界面元素和数据源之间建立关联。通过Binding,可以将界面元素(如文本框、标签、列表等)与数据源(如对象、集合、属性等)进行绑定,从而实现数据的双向传递和同步更新。
146 2
WPF技术之Binding
|
7月前
|
C#
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
22 0
|
7月前
|
存储 开发框架 .NET
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>
22 0
|
9月前
|
C#
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
94 0
|
10月前
|
C#
WPF属性---重复样式和触发器
WPF属性---重复样式和触发器
73 0
WPF界面异常:未将对象引用设置到对象实例
WPF界面异常:未将对象引用设置到对象实例
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
|
C# 前端开发
WPF中的多进程(Threading)处理实例(一)
原文:WPF中的多进程(Threading)处理实例(一) 说明:希望通过揣摩这些案例,能进一步了解进程的工作原理。 1.方法一描述的是在同一窗口中,在计算素数的同时而不影响Canvas的工作。 方法1 1 #region Long-Running Calculat...
1534 0
|
C#
WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? 我向大家介绍一个用 依赖属性(DependencyProperty) 实现的方法。
2443 0