武漢北大青鳥 > IT技術教程 > .NET技術教程 >

WPF實例秀不用屬性也Binding

時間:2015-05-07來源:北大青鳥徐東校區

實際編程中,因為我們較多地使用到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

分享到:

作者: 武漢北大青鳥 原載: 武漢北大青鳥徐東校區 www.gaidft.icu
版權所有,轉載時必須以鏈接形式注明作者和原始出處及本聲明

027-87660036

開班信息

只為了方便您就學 徐東校區

武漢市洪山區友誼大道504號金馬凱旋家居北大青鳥徐東校區2樓(地鐵8號線徐東站D出口徐東平價旁)

全真項目實戰 入學簽就業協議

Copyright (c) 2006-2020 武漢宏鵬職業培訓學校 版權所有 All Rights Reserved.

在線咨詢