mg4355娱乐城 > IT技术教程 > .NET技术教程 >

WPF实例秀不用属性也Binding

时间:2015-05-07来源:www.4355.com徐东校区

实际编程中,因为我们较多地使用到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>


责任编辑:admin

分享到:

作者: mg4355娱乐城 原载: mg4355娱乐城徐东校区 www.whhpit.com
版权所有,转载时必须以链接形式注明作者和原始出处及本声明

027-87660036

开班信息

只为了方便您就学 徐东校区

武汉市洪山区友谊大道504号金马凯旋家居www.4355.com徐东校区2楼(地铁8号线徐东站D出口徐东平价旁)

全真项目实战 入学签就业协议

Copyright (c) 2006-2020 mg4355娱乐城 版权所有 All Rights Reserved.

在线咨询