WPF实例秀——不用属性也Binding(XAML篇)

本文介绍如何使用WPF中的ObjectDataProvider类,使原本未设计为数据源的类也能用于数据绑定,通过示例展示如何实现加法操作的绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

正文:

实际编程中,因为我们较多地使用到Binding类的Source与Path,所以可能会有一个思维定式,那就是:有可能作为数据源的类一定要准备好一些属性,这些属性将作为Binding的Path。

如果本着这个思想去设计有可能作为数据源的类,那么会有两个问题出现:

1. 这个类的哪些属性有可能作为数据源的Path?是都需要激发NotifyPropertyChanged事件,还是用到了再添加?这很有可能让这个类迟迟不能封闭。

2. 需要用属性把一些方法包装起来,用来暴露给Binding,造成冗余和语义上的不美观。

其实,WPF类库里有一个名为ObjectDataProvider的类就是专门为了解决这个矛盾的——有了这个类,你在设计自己的类的时候就不必总想着把它设计成数据源的事儿了,该怎么抽象就怎么抽象、该怎么封装就怎么封装。

你可能会问:“如果这个类已经封闭了(不再改动)而我又需要拿它当数据源了,碰巧所需要的数据是它某个方法的返回值,没有对应属性,怎么办?”OK,这就是ObjectDataProvider的用武之地了——使用它,可以在你这个类的实例外面加上一层“包装”(或者说是加个壳儿),使它变成一个标准的Binding数据源。如果没记错的话,这应该是著名的“适配器模式”

下面,我们用一段简单的代码来学习如何使用ObjectDataProvider。

这个例子简单到不能再简单——三个TextBox,在前两个里输入合适的数字,在第三个里会显示它们的和。按照UI与逻辑分开的原则,计算加法的功能应该由某个类来实现。

后台负责计算的类是这样:

  1. publicclassCalculator
  2. {
  3. publicintAdd(intarg1,intarg2)
  4. {
  5. returnarg1+arg2;
  6. }
  7. publicstringAdd(stringarg1,stringarg2)
  8. {
  9. intx=0;
  10. inty=0;
  11. if(int.TryParse(arg1,outx)&&int.TryParse(arg2,outy))
  12. {
  13. returnthis.Add(x,y).ToString();
  14. }
  15. else
  16. {
  17. return"InputError!";
  18. }
  19. }
  20. }

大家看到了,设计这个类的时候,涉及到加法运算的逻辑时,任何一个程序员都会很自然地采用一个方法来实现,而不会为了把它做成一个Binding的数据源专门把这些方法封装进属性里——这样就破坏了面向对象的抽象。

然后,让我们看看如何使用ObjectDataProvider来包装这个类。

  1. <Windowx: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. <ObjectDataProviderx:Key="odp"ObjectType="{x:Typelocal: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. <TextBoxx:Name="textBox1"Margin="5"Text="{BindingSource={StaticResourceodp},Path=MethodParameters[0],BindsDirectlyToSource=true,UpdateSourceTrigger=PropertyChanged}"/>
  17. <TextBoxx:Name="textBox2"Margin="5"Text="{BindingSource={StaticResourceodp},Path=MethodParameters[1],BindsDirectlyToSource=true,UpdateSourceTrigger=PropertyChanged}"/>
  18. <TextBoxx:Name="textBox3"Margin="5"Text="{BindingSource={StaticResourceodp},Mode=OneWay}"/>
  19. </StackPanel>
  20. </Window>

运行起来之后,你就能看到这样的结果了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值