專利名稱:用數(shù)據(jù)控制用戶界面屬性的系統(tǒng)和方法
本申請(qǐng)由美國(guó)的和常駐美國(guó)的微軟公司于2003年5月17日作為PCT申請(qǐng)?zhí)岢龅模付ǔ嗣绹?guó)之外所有的國(guó)家。
發(fā)明的背景為用戶提供信息的方式可以影響到用戶理解和領(lǐng)會(huì)該信息的能力。在計(jì)算機(jī)顯示器上,通過(guò)使用顏色,字形等等來(lái)將重點(diǎn)加入到信息中成為一個(gè)標(biāo)準(zhǔn)的習(xí)慣。該重點(diǎn)使用戶更加容易領(lǐng)會(huì)信息的重要性。處理顯示信息(用戶界面)的代碼和執(zhí)行信息上應(yīng)用程序的代碼邏輯典型地密切相關(guān)。例如,所述邏輯直接用數(shù)據(jù)分配用戶界面屬性(例如,顏色,字體,位置,大小)。因此,當(dāng)用戶界面發(fā)生變化時(shí),該邏輯也必須改變。例如,就一個(gè)文本框來(lái)說(shuō),用戶界面代碼得知以便決定文本是否改變,并基于一個(gè)改變,用戶界面代碼確認(rèn)已經(jīng)改變的文本然后顯示該改變的文本。用戶界面和邏輯密切相關(guān)的特性導(dǎo)致脆弱的代碼。維護(hù)該脆弱的代碼是非常昂貴和費(fèi)時(shí)的。
發(fā)明概述本發(fā)明涉及一種用數(shù)據(jù)控制用戶界面的系統(tǒng)和方法。本發(fā)明通過(guò)提供一個(gè)用于將數(shù)據(jù)與用戶界面相結(jié)合的機(jī)制,將用戶界面和數(shù)據(jù)連同它的應(yīng)用程序邏輯相分離。本發(fā)明使用戶界面設(shè)計(jì)者和撰寫應(yīng)用程序邏輯的應(yīng)用程序創(chuàng)造者能夠獨(dú)立地工作。設(shè)計(jì)者和創(chuàng)造者都不需要理解對(duì)方的代碼或不影響對(duì)方的代碼開發(fā)。本發(fā)明也允許容易地改變用戶界面。例如,當(dāng)新的和更多的用戶要求的用戶界面平臺(tái)變得可利用時(shí)或者當(dāng)用戶界面設(shè)計(jì)者想要改變應(yīng)用程序的外表時(shí),該設(shè)計(jì)者不需要改變應(yīng)用程序邏輯。另外,用于將數(shù)據(jù)與用戶界面結(jié)合的機(jī)制是動(dòng)態(tài)的。這允許數(shù)據(jù)中的任何變化在顯示中被自動(dòng)的反映。另外,通過(guò)用戶界面從用戶輸入的任何數(shù)據(jù)可以自動(dòng)地更新。因?yàn)楸景l(fā)明允許不僅用戶界面的數(shù)據(jù)顯示方面(例如,文本)的關(guān)聯(lián),而且運(yùn)行用戶界面視覺(jué)方面(例如,背景,字體大小,等等)的關(guān)聯(lián),所以可以提供數(shù)據(jù)的視覺(jué)的增強(qiáng)和靈活的顯示。例如,負(fù)數(shù)可以用紅色顯示或者當(dāng)股票價(jià)錢增長(zhǎng)的時(shí)候可以出現(xiàn)一個(gè)向上的箭頭。
因此,根據(jù)本發(fā)明,應(yīng)用程序被分為獨(dú)立的部分,一個(gè)邏輯部分和一個(gè)用戶界面部分。邏輯部分處理應(yīng)用程序中的數(shù)據(jù)值。用戶界面部分負(fù)責(zé)數(shù)據(jù)的顯示。綁定規(guī)范描述了用戶界面屬性和數(shù)據(jù)值之間的關(guān)系。系統(tǒng)級(jí)別代碼使用綁定規(guī)范來(lái)決定當(dāng)數(shù)據(jù)值經(jīng)歷變化時(shí)通知的方式以及指導(dǎo)用戶界面部分來(lái)反映用戶界面屬性的變化的方式。綁定規(guī)范確定一個(gè)源數(shù)據(jù)項(xiàng),源數(shù)據(jù)項(xiàng)中到數(shù)據(jù)值的一個(gè)路徑,一個(gè)目標(biāo)用戶界面元素,和目標(biāo)用戶界面元素上的用戶界面屬性。該綁定規(guī)范可以使用代碼或標(biāo)記語(yǔ)言來(lái)指定。
附圖的簡(jiǎn)要說(shuō)明
圖1說(shuō)明了一種代表性的計(jì)算設(shè)備,該設(shè)備可以用于本發(fā)明的說(shuō)明性的實(shí)現(xiàn)中。
圖2說(shuō)明了根據(jù)本發(fā)明用數(shù)據(jù)控制的用戶界面屬性的一個(gè)實(shí)施例的功能結(jié)構(gòu)框圖。
圖3說(shuō)明了根據(jù)本發(fā)明的一個(gè)實(shí)施例用數(shù)據(jù)值綁定用戶界面屬性的一個(gè)處理的邏輯流程圖。
圖4說(shuō)明了根據(jù)本發(fā)明用于將用戶界面屬性與數(shù)據(jù)相結(jié)合的多個(gè)代表性的語(yǔ)法。
優(yōu)選實(shí)施例的詳細(xì)說(shuō)明本發(fā)明涉及一種用數(shù)據(jù)控制用戶界面的系統(tǒng)和方法。本發(fā)明通過(guò)提供一個(gè)用于將數(shù)據(jù)與用戶界面相結(jié)合的機(jī)制,將用戶界面和應(yīng)用程序邏輯相分離。如下面將要詳細(xì)描述的,這種用戶界面與數(shù)據(jù)連同與它相聯(lián)系的邏輯的分離,允許不同組的開發(fā)者在不影響其他組的代碼開發(fā)的情況下,在用戶界面和邏輯上獨(dú)立地工作。另外,如以下所詳細(xì)描述的,本發(fā)明提供了一個(gè)用于從數(shù)據(jù)源到用戶界面自動(dòng)傳送值的系統(tǒng)和機(jī)制,反之亦然。貫穿以下的討論,術(shù)語(yǔ)“數(shù)據(jù)綁定”是指將數(shù)據(jù)值與用戶界面屬性相聯(lián)系,傳送和更新數(shù)據(jù)值,等等的過(guò)程。
計(jì)算環(huán)境說(shuō)明圖1說(shuō)明了一種代表性的計(jì)算設(shè)備,該設(shè)備可以在本發(fā)明的說(shuō)明性的執(zhí)行中被使用。參照?qǐng)D1,在最基本的結(jié)構(gòu)中,計(jì)算設(shè)備100典型地至少包括一個(gè)處理單元102和系統(tǒng)存儲(chǔ)器104。根據(jù)計(jì)算設(shè)備100的精確的結(jié)構(gòu)和類型,系統(tǒng)存儲(chǔ)器104可以是易失性的(例如隨機(jī)存儲(chǔ)器),非易失性的(例如只讀存儲(chǔ)器,閃存,等等)或兩者的結(jié)合。系統(tǒng)存儲(chǔ)器104典型地包括一個(gè)操作系統(tǒng)105,一個(gè)或多個(gè)程序模塊106,并且可以包括程序數(shù)據(jù)107。程序模塊106的例子包括一個(gè)瀏覽器應(yīng)用程序,一個(gè)金融管理應(yīng)用程序,一個(gè)字處理器,等等。這個(gè)基本的結(jié)構(gòu)在圖1中通過(guò)虛線108中的那些部件而被說(shuō)明。
計(jì)算設(shè)備100可以具有額外的特征或功能。例如,計(jì)算設(shè)備100也可以包括額外的數(shù)據(jù)存儲(chǔ)設(shè)備(可移動(dòng)的和/或不可移動(dòng)的)例如,磁盤,光盤,或磁帶。該額外的存儲(chǔ)器在圖1中由可移動(dòng)的存儲(chǔ)器109和不可移動(dòng)的存儲(chǔ)器110說(shuō)明。計(jì)算機(jī)存儲(chǔ)介質(zhì)可以包括易失性和非易失性的,在任意的方法或技術(shù)中被執(zhí)行用于信息的存儲(chǔ)的可移動(dòng)和不可移動(dòng)的介質(zhì),例如計(jì)算機(jī)可讀指令,數(shù)據(jù)結(jié)構(gòu),程序模塊,或其他數(shù)據(jù)。系統(tǒng)存儲(chǔ)器104,可移動(dòng)存儲(chǔ)器109和不可移動(dòng)存儲(chǔ)器110都是計(jì)算機(jī)存儲(chǔ)介質(zhì)的例子。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括,但并不被限定為,隨機(jī)存儲(chǔ)器,只讀存儲(chǔ)器,電可擦除只讀存儲(chǔ)器,閃存或其他存儲(chǔ)技術(shù),光盤驅(qū)動(dòng)器,數(shù)字化視頻光盤(DVD)或其他光學(xué)存儲(chǔ)器,盒式磁帶,磁帶,磁盤存儲(chǔ)器或其他磁存儲(chǔ)設(shè)備,或任何其他可以用于存儲(chǔ)想要的信息以及可以由計(jì)算設(shè)備100存取的介質(zhì)。任何這種計(jì)算機(jī)存儲(chǔ)介質(zhì)可以是設(shè)備100的一部分。計(jì)算設(shè)備100也可以具有輸入設(shè)備112例如鍵盤,鼠標(biāo),輸入筆,聲音輸入設(shè)備,觸摸式輸入設(shè)備,等等。也可以包括輸出設(shè)備114例如顯示器,揚(yáng)聲器,打印機(jī),等等。這些設(shè)備在現(xiàn)有技術(shù)中是公知的所以在這里不需要長(zhǎng)篇的論述。
計(jì)算設(shè)備100也可以包括通信線路116,該線路允許設(shè)備100與其他計(jì)算設(shè)備118通信,例如通過(guò)一個(gè)網(wǎng)絡(luò)。通信線路116是通信介質(zhì)的一個(gè)例子。通信介質(zhì)典型地可以由計(jì)算機(jī)可讀指令,數(shù)據(jù)結(jié)構(gòu),程序模塊,或調(diào)整的數(shù)據(jù)信號(hào)中的其他數(shù)據(jù)而具體化,例如載波或其他傳送機(jī)制,并且包括任何信息傳送介質(zhì)。術(shù)語(yǔ)“調(diào)制的數(shù)據(jù)信號(hào)”是指一個(gè)信號(hào),該信號(hào)具有一個(gè)或多個(gè)采用以所述方式設(shè)置或改變的特征以便在信號(hào)中編碼信息。作為例子,并且不是限定性的,通信介質(zhì)包括有線介質(zhì)例如有線網(wǎng)絡(luò)或單線線路,和無(wú)線介質(zhì)例如聲學(xué),廣播,紅外線和其他無(wú)線介質(zhì)。這里使用的術(shù)語(yǔ)計(jì)算機(jī)可讀介質(zhì)包括存儲(chǔ)介質(zhì)和通信介質(zhì)。
實(shí)現(xiàn)說(shuō)明圖2是一個(gè)功能結(jié)構(gòu)框圖,說(shuō)明了根據(jù)本發(fā)明用數(shù)據(jù)控制用戶界面屬性的系統(tǒng)200的一個(gè)實(shí)施例。系統(tǒng)200包括一個(gè)應(yīng)用程序202,一個(gè)平臺(tái)220,和一個(gè)數(shù)據(jù)源230。應(yīng)用程序202可以是圖1中所示的計(jì)算設(shè)備100上的應(yīng)用程序106之一。應(yīng)用程序202包括用于操作數(shù)據(jù)值(例如,源數(shù)據(jù)值238)的代碼(以下稱作邏輯204)。通常,邏輯204執(zhí)行數(shù)據(jù)值的確認(rèn)和數(shù)據(jù)值更新。數(shù)據(jù)值(例如,數(shù)據(jù)值238)表示數(shù)據(jù)項(xiàng)(例如,數(shù)據(jù)項(xiàng)232)的屬性(即,數(shù)據(jù)源屬性)的內(nèi)容。數(shù)據(jù)項(xiàng)232位于數(shù)據(jù)源(例如,數(shù)據(jù)源230)中。每一個(gè)數(shù)據(jù)源230可以包括許多數(shù)據(jù)項(xiàng),每一個(gè)數(shù)據(jù)項(xiàng)具有一個(gè)或多個(gè)屬性,在其中源數(shù)據(jù)值被存儲(chǔ)。邏輯203可以從多個(gè)數(shù)據(jù)源操作數(shù)據(jù)值。該數(shù)據(jù)源可以包括一個(gè)XML文件,一個(gè)對(duì)象,一個(gè)數(shù)據(jù)集合,等等。如下面將被大量詳細(xì)討論的,數(shù)據(jù)項(xiàng)的每一個(gè)屬性可以被用于控制用戶界面(UI)。
應(yīng)用程序202也包括用于顯示信息的代碼(以下稱作用戶界面206)。該用戶界面206包括許多用戶界面元素(例如,用戶界面元素208)。每一個(gè)用戶界面元素208包括一個(gè)或多個(gè)屬性(例如,用戶界面屬性210和212),例如用于顯示文本,顏色,字體,位置,大小,等等。另外,如隨后詳細(xì)描述的,根據(jù)本發(fā)明這些用戶界面屬性210和212與一個(gè)或多個(gè)數(shù)據(jù)值238和242相聯(lián)系。通常,通過(guò)平臺(tái)220中的綁定引擎224發(fā)生聯(lián)系。該平臺(tái)220代表服務(wù)的系統(tǒng)層,例如一個(gè)操作系統(tǒng),一個(gè)虛擬引擎,等等。該平臺(tái)220也包括一個(gè)負(fù)責(zé)維護(hù)關(guān)于數(shù)據(jù)值234和242的分級(jí)信息以及負(fù)責(zé)更新與屬性相關(guān)的數(shù)據(jù)值的屬性引擎222。即使綁定引擎224和屬性引擎222作為單獨(dú)的部件被顯示,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,在不脫離本發(fā)明的情況下,每個(gè)部件所提供的功能可以包括在一個(gè)部件中。
數(shù)據(jù)值238和242與它們的用戶界面屬性210和212的聯(lián)系(例如,綁定)由圖2中從數(shù)據(jù)值到用戶界面屬性的折線表示(以下稱作綁定226和228)。在以下的討論中,術(shù)語(yǔ)“數(shù)據(jù)值”可以與術(shù)語(yǔ)“源數(shù)據(jù)值”交替使用。同樣地,術(shù)語(yǔ)用戶界面屬性可以與術(shù)語(yǔ)“目標(biāo)屬性”交替使用。這些綁定226和228允許從數(shù)據(jù)值(例如,源數(shù)據(jù)值)自動(dòng)設(shè)置動(dòng)態(tài)屬性(例如,目標(biāo)屬性),例如從任意對(duì)象的屬性。這些綁定可以是動(dòng)態(tài)的以至于約束目標(biāo)屬性自動(dòng)地更新來(lái)反映源數(shù)據(jù)值中的變化。
為了提供這種自動(dòng)更新的能力,本發(fā)明進(jìn)一步提供了一種通知機(jī)制(例如,圖2中由通知者236和240以及從通知者到平臺(tái)220的箭頭表示)。每一個(gè)數(shù)據(jù)項(xiàng)232和234分別具有一個(gè)相應(yīng)的通知者236和240。該通知機(jī)制負(fù)責(zé)通知系統(tǒng)源數(shù)據(jù)值發(fā)生了變化以及數(shù)據(jù)值可以被傳送到目標(biāo)屬性(例如,用戶界面屬性)。
當(dāng)創(chuàng)建一個(gè)綁定226和228時(shí),例如通過(guò)標(biāo)記,代碼,等等,該綁定引擎224創(chuàng)建一個(gè)與該綁定相聯(lián)系的綁定對(duì)象(例如,綁定對(duì)象250和252)。例如,綁定對(duì)象252可以表示綁定引擎224中的綁定228。每一個(gè)綁定對(duì)象包括許多屬性(例如,綁定屬性260-272)。這些綁定屬性260-272中的每一個(gè)可以被程序化地設(shè)置。下面的討論分別描述這些屬性并且圖4說(shuō)明了用于激活一個(gè)指定了這些屬性的綁定的代表性的代碼。
綁定屬性之一(以下稱作路徑260)確定設(shè)置源數(shù)據(jù)值的方式(通過(guò)源對(duì)象)。路徑260可以指源對(duì)象上的一個(gè)屬性,子屬性或索引,ADO中的列(激活X數(shù)據(jù)對(duì)象),XML上的一個(gè)X路徑,等等??蛇x地,該路徑可以指一個(gè)反映或ADO路徑。
另外一個(gè)綁定屬性(以下稱作綁定類型262)為綁定226和228定義一個(gè)類型。在一個(gè)實(shí)施例中,該綁定類型包括單向的,雙向的,和一次性的。作為一個(gè)說(shuō)明,綁定226表示一個(gè)雙向綁定而綁定228表示一個(gè)單向綁定。這些綁定類型之一作為一個(gè)默認(rèn)值被設(shè)置。在一個(gè)實(shí)施例中,雙向綁定被設(shè)置為默認(rèn)綁定類型。
當(dāng)綁定類型262被指定為單向時(shí),每當(dāng)相聯(lián)系的源數(shù)據(jù)值發(fā)生變化時(shí),發(fā)信號(hào)通知綁定引擎224更新目標(biāo)屬性(例如,用戶界面屬性210)。單向綁定類型有利于將數(shù)據(jù)值綁定到一個(gè)不可編輯的用戶界面屬性,例如文本顏色,文本背景,等等。使用單向綁定類型可以回避雙向綁定類型的費(fèi)用,如在下面所描述的。當(dāng)?shù)弥脩艚缑鎸傩灾嘘P(guān)于設(shè)計(jì)內(nèi)容的改變時(shí),這種費(fèi)用的減少是最值得關(guān)注的。對(duì)于這些用戶界面屬性,為了改變用戶界面屬性,必須偵聽(tīng)用戶界面屬性的每一個(gè)子屬性的動(dòng)態(tài)屬性。當(dāng)用戶界面屬性中的變化僅僅是為了顯示其他表述細(xì)節(jié)時(shí),單向綁定類型也是有用的。
當(dāng)綁定類型262被指定為雙向時(shí),每當(dāng)源數(shù)據(jù)值發(fā)生變化時(shí),發(fā)信號(hào)通知綁定引擎224更新目標(biāo)屬性,反之亦然。當(dāng)綁定數(shù)據(jù)到編輯框時(shí)雙向綁定是特別有用的,其中該編輯框由編輯框中的用戶產(chǎn)生的許多變化需要被傳遞到源數(shù)據(jù)值,作為雙向綁定的另一個(gè)方案是,當(dāng)另一個(gè)應(yīng)用程序負(fù)責(zé)源數(shù)據(jù)字段時(shí),那些變化反映在編輯框中。
當(dāng)綁定類型262被指定為一次性時(shí),發(fā)信號(hào)通知綁定引擎224立刻初始化目標(biāo)屬性,然后將它維持不變,即使相聯(lián)系的源數(shù)據(jù)值被改變。當(dāng)一些目標(biāo)屬性需要從源字段被初始化為一些值并且該數(shù)據(jù)內(nèi)容不能預(yù)先知道時(shí),該一次性綁定類型是有用的。另外,一次性綁定類型作為沒(méi)有改變的源數(shù)據(jù)值的只讀使用是有用的。如果數(shù)據(jù)源不支持本發(fā)明的屬性通知機(jī)制(例如,IPropertychange),被指定為單向的目標(biāo)屬性將被同樣地更新,正如作為綁定類型被指定為一次性的綁定。
另外一個(gè)綁定屬性(以下稱作更新類型264)為綁定類型262被指定為雙向的情況定義一個(gè)更新類型。典型地,雙向綁定得知目標(biāo)屬性中的變化并且將這些變化傳遞回源數(shù)據(jù)值。這個(gè)過(guò)程被稱作更新源數(shù)據(jù)。通常地,希望隨時(shí)能夠更新目標(biāo)屬性的變化。然而,在某些情況下,每次擊鍵后更新浪費(fèi)周期并且拒絕用戶用于更正打字錯(cuò)誤的機(jī)會(huì),等等。當(dāng)更新將要發(fā)生時(shí),允許用戶指定更新類型264。在一個(gè)實(shí)施例中,更新類型264可以被指定為立即更新,失去光標(biāo)時(shí)更新,和明確更新。在每次改變目標(biāo)屬性后,指定“立即更新”發(fā)信號(hào)通知綁定引擎更新源數(shù)據(jù)值。在目標(biāo)單元失去鍵盤光標(biāo)后,指定“失去光標(biāo)時(shí)更新”發(fā)信號(hào)通知綁定引擎更新源數(shù)據(jù)值。只有當(dāng)應(yīng)用程序明確地要求更新時(shí),指定“明確更新”發(fā)信號(hào)通知綁定引擎更新源數(shù)據(jù)值。典型地,這種Explicit請(qǐng)求通過(guò)一種方法而被執(zhí)行。即使這種方法可能被調(diào)用用于任何更新類型264的設(shè)置,當(dāng)更新類型被設(shè)置為明確更新時(shí)該方法是可用的。一個(gè)代表性的方法如下所示Binding.GetBinding(myElement,myProperty).Update();.
另外的一個(gè)綁定屬性(以下稱作源266)為綁定確定源數(shù)據(jù)項(xiàng)。簡(jiǎn)單地,結(jié)合圖4中的說(shuō)明和描述,源266可以被程序化地設(shè)置或具有標(biāo)記。程序化地,開發(fā)者為對(duì)象提供一個(gè)綁定可以作為源數(shù)據(jù)項(xiàng)使用的對(duì)象裁決。簡(jiǎn)單地,結(jié)合圖4詳細(xì)地描述,在標(biāo)記中有各種用于設(shè)置源屬性的方法。
另外的一個(gè)綁定屬性(以下稱作轉(zhuǎn)換器268)接收一個(gè)類引用。該類引用可以使用<Namespace>.<Class>,<Assembly>來(lái)指定。被指定的類引用由綁定引擎224調(diào)用以便將源數(shù)據(jù)值轉(zhuǎn)換為目標(biāo)屬性接收的格式。類引用中的一個(gè)方法調(diào)用這個(gè)轉(zhuǎn)換,如圖2中的轉(zhuǎn)換244所表示的。該類引用也可以指定一個(gè)逆轉(zhuǎn)換(沒(méi)有示出)用于將目標(biāo)屬性轉(zhuǎn)換為源數(shù)據(jù)值接收的格式。該轉(zhuǎn)換244可以支持用戶界面語(yǔ)義學(xué)或可以是一個(gè)自定義類型的轉(zhuǎn)換器。
另外的一個(gè)綁定屬性(以下稱作文化270)定義一個(gè)方法,在轉(zhuǎn)換源數(shù)據(jù)值之前/之后,該方法中的源數(shù)據(jù)值被處理。文化270操作結(jié)合轉(zhuǎn)換器268以便允許開發(fā)者為轉(zhuǎn)換源數(shù)據(jù)值指定規(guī)則。例如,文化可以為數(shù)字,日期等等指定一個(gè)特定的格式。在一個(gè)實(shí)施例中,文化270接收文化信息類型的一個(gè)值。當(dāng)執(zhí)行該轉(zhuǎn)換時(shí),開發(fā)者具有通過(guò)文化270指定使用規(guī)則的選擇權(quán)。
另外的一個(gè)綁定屬性(以下稱作綁定標(biāo)志272)提供了一個(gè)用于接收發(fā)送信號(hào)通知傳遞數(shù)據(jù)的事件的機(jī)制。因?yàn)樯鲜鲇糜跀?shù)據(jù)綁定的方法是異步的,所以綁定標(biāo)志272允許開發(fā)者知道什么時(shí)候目標(biāo)被更新為新值。為了使用這個(gè)機(jī)制,綁定標(biāo)志272被設(shè)置為“NotifyOnTransfer”。然后管理者使用任何慣例方法記錄事件。用于該機(jī)制一個(gè)代表性的使用如下<pre listing-type="program-listing"><![CDATA[ Public static void main() { //增加處理程序 elem.AddAttachedHandler(Binding.DataTranferEvent, new DataTranferEventHandler(OnDataTransfer), RoutedEventArgs.EventStage.Direct); //事件處理程序 private static void OnDataTransfer(Element e, DataTransferEventArgs args) { DynamicProperty DP=args.DP; v=e.GetValue(DP); DoSomething(v); } source.field=“new value”; }.]]></pre>如以上所示的實(shí)例代碼,一旦OnDataTransfer事件被觸發(fā),開發(fā)者知道該動(dòng)態(tài)屬性被更新。因此,開發(fā)者隨后可以使用目標(biāo)值進(jìn)行進(jìn)一步的處理。
圖3是根據(jù)本發(fā)明的一個(gè)實(shí)施例說(shuō)明綁定機(jī)制的一個(gè)邏輯流程圖??偟目磥?lái),該綁定機(jī)制執(zhí)行操作來(lái)設(shè)置綁定(塊302-306)然后執(zhí)行相關(guān)的操作(塊310-338)來(lái)改變目標(biāo)屬性中或綁定中被指定的源數(shù)據(jù)值。處理在塊302繼續(xù)執(zhí)行。
在塊302,基于在創(chuàng)建過(guò)程中指定的參數(shù)創(chuàng)建一個(gè)綁定對(duì)象。簡(jiǎn)單地,在創(chuàng)建過(guò)程中,用于綁定對(duì)象252的每一個(gè)屬性(例如,圖2中所示的屬性260-272)可以被指定為一個(gè)參數(shù)。該綁定可以通過(guò)標(biāo)記,程序化地,等等來(lái)創(chuàng)建。圖4是說(shuō)明用于創(chuàng)建一個(gè)綁定以及用于指定屬性260-272的代表性的語(yǔ)法。每一個(gè)創(chuàng)建方法指定一個(gè)源數(shù)據(jù)項(xiàng),源數(shù)據(jù)項(xiàng)中到數(shù)據(jù)值的一個(gè)路徑,一個(gè)目標(biāo)用戶界面元素,和用戶界面元素上的一個(gè)目標(biāo)動(dòng)態(tài)屬性。雖然當(dāng)前的流程圖中沒(méi)有示出,但是綁定對(duì)象的屬性也可以在運(yùn)行時(shí)間中被動(dòng)態(tài)地修改,例如通過(guò)使用應(yīng)用編程接口(APIs)。處理進(jìn)入塊306。
在塊304,綁定被激活。在一個(gè)實(shí)施例中,一旦綁定引擎發(fā)現(xiàn)有足夠的上下文用于綁定時(shí)該綁定被自動(dòng)地激活,例如已經(jīng)存在源對(duì)象,目標(biāo)元素準(zhǔn)備好顯示,等等。綁定引擎負(fù)責(zé)識(shí)別綁定的激活。處理在塊304繼續(xù)執(zhí)行。
在塊306,找到一個(gè)用于指定源屬性的值。在一個(gè)實(shí)施例中,反映被用于尋找該值。反映是一個(gè)普通的機(jī)制,該機(jī)制允許調(diào)用程序獲得關(guān)于被請(qǐng)求對(duì)象的信息。該信息包括被支持的對(duì)象,公共屬性,等等。在另一個(gè)實(shí)施例中,當(dāng)數(shù)據(jù)項(xiàng)為一個(gè)集合時(shí),綁定引擎執(zhí)行多個(gè)探索性的方法來(lái)決定是否使用當(dāng)前的記錄或數(shù)據(jù)對(duì)象(集合)本身。當(dāng)該綁定涉及屬性或索引時(shí),應(yīng)用第一個(gè)探索性的方法。在這種情況下,如果該屬性或索引存在,集合對(duì)象上相應(yīng)的屬性或索引被使用??蛇x地,集合當(dāng)前的記錄作為數(shù)據(jù)項(xiàng)使用。當(dāng)不存在屬性或索引時(shí)應(yīng)用另一個(gè)探索性的方法。在這種情況下,只要集合對(duì)象有效,該集合對(duì)象作為目標(biāo)屬性被使用。否則,使用當(dāng)前的記錄。在繼續(xù)執(zhí)行塊308之前,如果綁定指定一個(gè)轉(zhuǎn)換(塊307),將轉(zhuǎn)換應(yīng)用到該值。下面結(jié)合塊316詳細(xì)地描述該轉(zhuǎn)換的應(yīng)用程序。處理在塊308繼續(xù)執(zhí)行。
在塊308,被找到的值分配給目標(biāo)屬性。在一個(gè)實(shí)施例中,負(fù)責(zé)維護(hù)屬性級(jí)別的屬性引擎可以分配該值。在另一個(gè)實(shí)施例中,在綁定的創(chuàng)建過(guò)程中指定的轉(zhuǎn)換可以被調(diào)用,以便在將該值分配給目標(biāo)屬性之前轉(zhuǎn)換該值。在進(jìn)一步的改進(jìn)中,屬性引擎可以將屬性標(biāo)記為具有一個(gè)新值。一旦塊302-308被執(zhí)行,綁定引擎準(zhǔn)備好按照需要更新目標(biāo)屬性和源數(shù)據(jù)值。通常,該結(jié)合機(jī)制是異步的。
因此,從塊308,處理通過(guò)兩個(gè)異步路徑繼續(xù)執(zhí)行。第一個(gè)路徑(塊310-318)與更新目標(biāo)屬性相聯(lián)系而第二個(gè)路徑(塊330-338)與更新源數(shù)據(jù)值相聯(lián)系。每一個(gè)路徑在下面被描述。首先,討論負(fù)責(zé)更新目標(biāo)屬性的路徑。
在判定塊310,綁定引擎決定與源數(shù)據(jù)值和目標(biāo)屬性相聯(lián)系的綁定是否被指定為一次性綁定類型。如果該綁定類型是一次性的,處理完成該綁定并且轉(zhuǎn)到結(jié)束。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,如果該綁定類型是一次性的,綁定引擎不得知源屬性的改變事件。因此,在實(shí)際操作中,綁定引擎中的邏輯沒(méi)有必要執(zhí)行檢測(cè),如塊310中所示。另外,如果數(shù)據(jù)項(xiàng)不執(zhí)行IPropertychange,處理結(jié)束。然而,如果綁定類型不是一次性的,處理在塊312繼續(xù)執(zhí)行。
在塊312,綁定引擎得知與綁定相關(guān)聯(lián)的通知。因?yàn)閿?shù)據(jù)綁定不直接更新具有源數(shù)據(jù)值的目標(biāo),本發(fā)明執(zhí)行一個(gè)通知機(jī)制。通知機(jī)制,例如屬性變化通知和集合視圖“CurrentChanged”通知等等,在現(xiàn)有技術(shù)中是公知的因此在這里不需要長(zhǎng)篇地討論。不同的操作引起一個(gè)通知,例如數(shù)據(jù)值的改變,頁(yè)的導(dǎo)航,停機(jī),數(shù)據(jù)集合中興趣記錄的改變,等等。因?yàn)榘l(fā)明在數(shù)據(jù)集合中興趣記錄的變化時(shí)引發(fā)一個(gè)更新,本發(fā)明提供了一個(gè)用于進(jìn)一步分離用戶界面和邏輯的方便的機(jī)制。例如,根據(jù)本發(fā)明,開發(fā)者只需要在邏輯中寫入代碼來(lái)指定如何改變數(shù)據(jù)集合中的下一條興趣記錄。一旦發(fā)生變化,根據(jù)本發(fā)明,綁定引擎將根據(jù)已經(jīng)指定的綁定來(lái)更新用戶界面。如前面所提到的,這種用戶界面和邏輯的分離提供了一個(gè)比當(dāng)用戶界面和邏輯編結(jié)在一起時(shí)更強(qiáng)大和更容易維護(hù)的應(yīng)用程序。
下面的代碼是用于通知機(jī)制的一個(gè)代表性的執(zhí)行過(guò)程。雖然下面編寫的代表性的代碼是在C語(yǔ)言中編寫的,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到可以使用各種語(yǔ)言和語(yǔ)法執(zhí)行該通知機(jī)制。對(duì)于任何這樣的執(zhí)行過(guò)程,通過(guò)每個(gè)數(shù)據(jù)項(xiàng)為用戶定義一個(gè)界面。每一個(gè)數(shù)據(jù)項(xiàng)繼承這個(gè)界面以便實(shí)施動(dòng)態(tài)地更新。
Public interface IPropertyChange{event PropertyChangedEventHandler PropertyChanged;}.
接下來(lái),定義事件處理程序及其參數(shù)public delegate void PropertyChangedEventHandler(objectsender,PropertyChangedEventArgs e);public class PropertyChangedEventArgsEventArgs
{public virtual string PropertyName{get;}}.
該P(yáng)ropertyChangedEventArgs類包括一個(gè)命名為PropertyName具有一個(gè)類型串的只讀屬性。該P(yáng)ropertyName屬性包括一個(gè)用于被改變屬性的名字。每當(dāng)界面的一個(gè)屬性被改變時(shí),每一個(gè)源數(shù)據(jù)項(xiàng)則通過(guò)調(diào)用PropertyChanged代表來(lái)執(zhí)行這個(gè)界面。下面是根據(jù)作為通知機(jī)制的實(shí)施例用于執(zhí)行一個(gè)源對(duì)象(例如,數(shù)據(jù)項(xiàng)232)的一個(gè)說(shuō)明性的例子。
<pre listing-type="program-listing"><![CDATA[ public class myClassIPropertyChange { private string foo=“Hello World”; public string Foo { get{return foo;} set{if(foo!=value) { foo=value; NotifyPropertyChanged(“foo”); } } public event PropertyChangedEventHandler Property Changed; private void NotifyPropertyChanged(string propName) { PropertyChanged(this,new PropertyChangedEventArgs(propName)); } }.]]></pre>如以上代表性的代碼中所示的,用于‘foo’屬性的‘set’方法判斷新值是否與舊值不同。如果該值不同,處理程序被調(diào)用。執(zhí)行反映來(lái)獲得PropertyInfo。在進(jìn)一步的改進(jìn)中,一旦通過(guò)反映獲得屬性類型,綁定引擎可以存儲(chǔ)該屬性的類型。因此,一旦執(zhí)行反映,并不是每一次為屬性接收一個(gè)通知。在另外的一個(gè)改進(jìn)中,空串可以被傳遞到自變量中以便發(fā)信號(hào)通知所有的綁定來(lái)更新每一個(gè)數(shù)據(jù)項(xiàng)的數(shù)據(jù)值。當(dāng)源對(duì)象不確定有關(guān)發(fā)生改變的屬性時(shí)這種情況可能發(fā)生,并且更新每個(gè)綁定。一旦綁定引擎接收一個(gè)有關(guān)源數(shù)據(jù)值發(fā)生變化的通知,處理在判決塊314繼續(xù)執(zhí)行。
在判決塊314,創(chuàng)建一個(gè)綁定是否與被改變的源數(shù)據(jù)值相聯(lián)系的決定并為綁定指定一個(gè)轉(zhuǎn)換。如果綁定沒(méi)有指定一個(gè)轉(zhuǎn)換,處理在塊318繼續(xù)執(zhí)行。然而,如果綁定指定了一個(gè)轉(zhuǎn)換,處理在塊316繼續(xù)執(zhí)行。
在塊316,執(zhí)行綁定中被指定的轉(zhuǎn)換。在一個(gè)實(shí)施例中,轉(zhuǎn)換器268是一個(gè)如下描述的對(duì)象Public interface IDataTransformer{Public object Transform(object o,DynamicProperty dp,Cultureinfo c){;}}.
對(duì)于上述的界面,o代表源值,dp代表動(dòng)態(tài)目標(biāo)屬性,以及c代表在轉(zhuǎn)換過(guò)程中使用的文化。Transform()方法將源值o轉(zhuǎn)換成一個(gè)適合分配類型dp的動(dòng)態(tài)屬性的對(duì)象。當(dāng)將數(shù)據(jù)值從綁定的源傳遞到目標(biāo)屬性時(shí)Transform()方法被調(diào)用。如果Transform()方法返回一個(gè)空值,發(fā)信號(hào)通知綁定引擎停止值的傳遞。
轉(zhuǎn)換器也可以基于在綁定中被指定的相關(guān)源數(shù)據(jù)值用于控制其他用戶界面屬性,例如寬度,高度,字體,定位(x,y),等等。為了用各種方法顯示數(shù)據(jù),轉(zhuǎn)換器提供了在數(shù)據(jù)值上執(zhí)行邏輯的能力。在一個(gè)進(jìn)一步的改進(jìn)中,文化可以應(yīng)用在綁定中所指定的轉(zhuǎn)換過(guò)程中。處理在塊318繼續(xù)執(zhí)行。
在塊318,目標(biāo)屬性被更新。在一個(gè)實(shí)施例中,屬性引擎將值分配到目標(biāo)屬性。另外,目標(biāo)屬性可以被標(biāo)記為具有一個(gè)新值。然后處理可以繼續(xù)執(zhí)行到塊312并且偵聽(tīng)下一個(gè)與綁定相聯(lián)系的屬性變化通知。一旦應(yīng)用程序結(jié)束或綁定被終止,處理轉(zhuǎn)到結(jié)束。
如上所述,從塊308,處理可以通過(guò)第二個(gè)路徑繼續(xù)執(zhí)行。因此,從塊308,處理在判決塊330繼續(xù)執(zhí)行。如上所述關(guān)于判決塊310,在判決塊310的執(zhí)行過(guò)程中,綁定引擎中的邏輯可以不必執(zhí)行綁定類型的檢測(cè),而且,因?yàn)樵诮壎ū粍?chuàng)建的時(shí)候,綁定引擎沒(méi)有被告知要偵聽(tīng)通知,所以處理不能通過(guò)第二路徑流動(dòng)。然而,為了清楚地描述該流程,判決塊反映的結(jié)合類型被示出。因此,在判決塊330,創(chuàng)建一個(gè)綁定是否被指定為雙向綁定類型的決定。如先前討論的,雙向綁定允許目標(biāo)屬性中的變化被傳遞到源數(shù)據(jù)值。如果綁定不指定為雙向綁定類型,處理轉(zhuǎn)到結(jié)束。然而,如果綁定指定為雙向綁定類型,處理在塊332繼續(xù)執(zhí)行。
在塊332,綁定引擎將識(shí)別某些觸發(fā)更新源數(shù)據(jù)值的行為。一旦發(fā)生觸發(fā),處理在判決塊334繼續(xù)執(zhí)行。
在判決塊334,創(chuàng)建一個(gè)綁定是否為綁定指定一個(gè)反轉(zhuǎn)換的決定。如果綁定不指定一個(gè)反轉(zhuǎn)換,處理在塊338繼續(xù)執(zhí)行。然而,如果綁定指定一個(gè)反轉(zhuǎn)換,處理在塊336繼續(xù)執(zhí)行。
在塊336,反轉(zhuǎn)換應(yīng)用于源屬性。在一個(gè)實(shí)施例中,反轉(zhuǎn)換器是一個(gè)如下描述的對(duì)象Public interface IDataTransformer{Public object InverseTransform(object o,PropertyInfo pinfo,CultureInfo c){;}}.
對(duì)于上述的界面,o代表源值,c代表在轉(zhuǎn)換過(guò)程中使用的文化,以及pinfo代表目標(biāo)屬性的PropertyInfo。InverseTransform()方法將源值o轉(zhuǎn)換成一個(gè)適于分配類型信息的屬性的對(duì)象。當(dāng)從綁定的目標(biāo)將值傳遞到源時(shí)這個(gè)方法被調(diào)用。如果InverseTransform()方法返回一個(gè)空值,綁定引擎不傳遞值。一旦InverseTransform被執(zhí)行,處理在塊338繼續(xù)執(zhí)行。
在塊338,根據(jù)更新類型更新源屬性。如上所述,更新類型可以是立即更新,失去光標(biāo)時(shí)更新,明確更新,以及其他類型。一旦源屬性被更新,處理轉(zhuǎn)到結(jié)束。
圖4說(shuō)明了用于創(chuàng)建一個(gè)綁定的幾個(gè)代表性的方法。創(chuàng)建方法400-410通過(guò)標(biāo)記創(chuàng)建綁定。創(chuàng)建方法410通過(guò)代碼創(chuàng)建綁定。圖4中所示的說(shuō)明性的方法不是窮舉的。在不脫離本發(fā)明范圍的情況下,可以使用其他方法(語(yǔ)法)。
創(chuàng)建方法400包括一個(gè)用于單元424的DataContext名/值對(duì)(以下稱作DataContext 422)和Id名/值對(duì)(以下稱作Id420)。因?yàn)閯?chuàng)建方法400也包括DataContext 422,所以Id 420是不必要的。當(dāng)想要涉及一個(gè)確切源時(shí)需要Id420,例如提示中ElementSource的使用或代碼中IdObjectReg的使用。所有這些使用在下面被描述。DataContext 422是在單元(例如,單元424)上定義的一個(gè)動(dòng)態(tài)屬性。與DataContext422相關(guān)的值表示默認(rèn)源數(shù)據(jù)項(xiàng)并且是一個(gè)可繼承的屬性。當(dāng)為單元424和派生的單元(例如,按鈕單元426)創(chuàng)建一個(gè)綁定時(shí),綁定引擎查詢DataContext 422并且利用DataContext 422。綁定引擎也得知DataContext 422的變化,從而觸發(fā)一個(gè)更新。因此,雖然沒(méi)有被要求,但是DataContext 422為所有限制普通數(shù)據(jù)項(xiàng)的屬性提供一個(gè)用于確定范圍的方便的機(jī)制。子單元可以具有他們自己的DataContext,它將比父單元的DataContext 422優(yōu)先。綁定可以通過(guò)提供一個(gè)非空的源來(lái)覆蓋DataContext 422,結(jié)合創(chuàng)建方法402在下面描述。
結(jié)合目標(biāo)屬性說(shuō)明按鈕單元426(例如,Button.Text428)。根據(jù)本發(fā)明,根據(jù)遇到的“Data:Bind”,綁定引擎識(shí)別被指定的綁定。名/值對(duì)遵循照?qǐng)D2中所指定的設(shè)置綁定屬性267-272。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,用于發(fā)信號(hào)通知綁定的術(shù)語(yǔ)“Data:Bind”是隨意的一個(gè)術(shù)語(yǔ),在不脫離本發(fā)明范圍的情況下可以使用許多術(shù)語(yǔ)。創(chuàng)建方法400表示詳細(xì)的標(biāo)記格式。
創(chuàng)建方法402表示緊湊的提示格式。用戶界面屬性(例如,Button Text)在一個(gè)更緊湊的方式中被表示。此外,“Data:Bind”作為綁定引擎的一個(gè)信號(hào)而被使用,所述綁定引擎緊隨一個(gè)綁定。同樣,在相應(yīng)于想要的屬性260-272的Data:Bind之后的名/值對(duì)已經(jīng)作為綁定對(duì)象250在圖2中被早先描述。例如,ElementSource名/值對(duì)(以下稱作ElementSource 434)相應(yīng)于源266。
在標(biāo)記中,有兩種用于設(shè)置源屬性的方法ElementSource和DataSource。如果兩者都不被使用,作為源的默認(rèn)值為空,其發(fā)信號(hào)通知綁定引擎在創(chuàng)建時(shí)獲得單元的DataContext屬性的值并且作為源對(duì)象而使用該值。
當(dāng)創(chuàng)建方法(例如,創(chuàng)建方法402)指定一個(gè)ElementSource,綁定引擎找到該單元,該單元的ID由ElementSource屬性指定。然后那個(gè)單元的DataContext作為源對(duì)象被使用。相關(guān)的路徑名,例如/Parent/Parent和/Previous/Previous,可以用來(lái)指定數(shù)據(jù)源。當(dāng)綁定引擎遇到/Parent時(shí),綁定引擎根據(jù)對(duì)象層次尋找當(dāng)前單元的父單元。例如,如果該單元是一個(gè)客戶訂單,指定/Parent可以發(fā)信號(hào)通知綁定引擎尋找與客戶相應(yīng)的該單元作為當(dāng)前的訂單。指定/Parent在嵌套轉(zhuǎn)發(fā)器情況下是有用的,在該情況下想要在內(nèi)部轉(zhuǎn)發(fā)器的范圍內(nèi)使用從外部轉(zhuǎn)發(fā)器輸出的值。指定/Previous發(fā)信號(hào)通知綁定引擎在轉(zhuǎn)發(fā)器中尋找當(dāng)前單元之前的單元。當(dāng)想要訪問(wèn)除了當(dāng)前項(xiàng)以外的當(dāng)前的n項(xiàng)時(shí),指定/Previous是有用的,例如在線圖中等等。根據(jù)本發(fā)明可以使用連續(xù)的/Previous和/Parent。
在另一個(gè)實(shí)施例中,提示可以指定一個(gè)DataSource。當(dāng)指定DataSource時(shí),綁定引擎接收資源的資源標(biāo)識(shí)符。如果該資源顯露出數(shù)據(jù)屬性,則綁定引擎將設(shè)置綁定的源到對(duì)象,該對(duì)象由DataSource資源的數(shù)據(jù)屬性返回。否則,綁定引擎將綁定的源設(shè)置到資源對(duì)象本身。
本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,屬性260-272中有多種方法可以使用標(biāo)記語(yǔ)言表示,因此,可以使用標(biāo)記語(yǔ)言表示每個(gè)其他屬性的方式,在這里不作進(jìn)一步詳細(xì)地解釋。
以下的三個(gè)創(chuàng)建方法404-410在本發(fā)明可以綁定的項(xiàng)目的類型上提供了說(shuō)明性的例子。創(chuàng)建方法404說(shuō)明了支持綁定到子屬性和索引。與綁定相應(yīng)的創(chuàng)建方法404用C語(yǔ)言編寫如di.a.b[3].c,其中di是相關(guān)的數(shù)據(jù)項(xiàng)。在數(shù)據(jù)項(xiàng),類執(zhí)行di.a的時(shí)候,執(zhí)行di.a b的類和執(zhí)行di.a b[3].c的類都支持本發(fā)明的通知機(jī)制(例如,IPropertyChange)并且通知什么時(shí)候他們的屬性改變,被指定的綁定使用創(chuàng)建方法404使綁定引擎自動(dòng)更新限制屬性(例如,目標(biāo)屬性)以便反映源數(shù)據(jù)值中的變化。
創(chuàng)建方法406說(shuō)明了支持綁定到數(shù)據(jù)集合。綁定引擎將自動(dòng)使用集合在每一層的當(dāng)前記錄(其中a,b,和c表示不同的層)。例如,如果di.a具有一個(gè)IDataCollection類型,綁定使用集合當(dāng)前的記錄以便獲得“b”屬性。因此,每當(dāng)前記錄被改變時(shí),綁定引擎自動(dòng)更新與數(shù)據(jù)集合相聯(lián)系的值。
創(chuàng)建方法408說(shuō)明了支持綁定到XML節(jié)點(diǎn)。到該值的路徑260使用一個(gè)x路徑表達(dá)式來(lái)維護(hù),例如“/Customer/Order[@OrderID=10]/Amount)”,如圖4中所示。創(chuàng)建方法410說(shuō)明了綁定到ADO數(shù)據(jù)表的支持。對(duì)于這個(gè)執(zhí)行過(guò)程,到該值的路徑260作為用于特定行的域名被維護(hù),例如“OrderID”,如圖4中所示。
創(chuàng)建方法410創(chuàng)建可編程控制地綁定。開發(fā)者為對(duì)象提供了一個(gè)對(duì)象參考,該綁定將作為源數(shù)據(jù)項(xiàng)使用。創(chuàng)建方法412中顯示的程序語(yǔ)句創(chuàng)建一個(gè)與創(chuàng)建方法410所說(shuō)明的相同行為的綁定。SetBinding方法具有許多更精細(xì)的變量,通過(guò)該變量程序師可以指定上面討論的任何綁定屬性。上面簡(jiǎn)單的例子使用按鈕的DataContext作為源對(duì)象。下面的程序語(yǔ)句創(chuàng)建一個(gè)單向的綁定,該綁定使用特定的對(duì)象(在運(yùn)行時(shí)間中所知道的)作為源對(duì)象源=…一些任意的對(duì)象…;Binding.SetBinding(myButton,Element.BackgroundProperty,“Color”,BindType.OneWay,new ExplicitObjectRef(source));下面的實(shí)例代碼顯示了一個(gè)通過(guò)本發(fā)明的綁定機(jī)制用數(shù)據(jù)控制用戶界面屬性的執(zhí)行過(guò)程。在這個(gè)例子當(dāng)中,數(shù)據(jù)值(例如,myInteger)和用戶界面屬性(例如,TextContent)作為一個(gè)綁定而被激活。另外,為這個(gè)綁定指定一個(gè)轉(zhuǎn)換(例如,MyTranformer)。
<pre listing-type="program-listing"><![CDATA[ ?。糡est TextContent=“*Data:Bind(Path=myInteger)” Foreground=“*Data:Bind(Path=MyInteger; Transformer=MyTransformer)”/> public class MyTransformer:IDataTransformer { public object Transform(object o,DynamicProperty dp, CultureInfo culture) { if((int)o<0)return Red; else return Black; } public object InverseTransform(object o,PropertyInfo info, CultureInfo culture) { return null; } }.]]></pre>因此,作為描述,本發(fā)明提供了一個(gè)用于將源數(shù)據(jù)值與目標(biāo)屬性相關(guān)聯(lián)的機(jī)制,如此在用戶界面和邏輯中的譯碼的改變可以被分離。因此,本發(fā)明允許開發(fā)者容易地改變以及增強(qiáng)用戶界面而不需要它們改變應(yīng)用程序的下層邏輯。
上面的說(shuō)明,例子和數(shù)據(jù)提供了一個(gè)生產(chǎn)和使用本發(fā)明的成分的完整的描述。因?yàn)樵诓幻撾x本發(fā)明的精神和范圍的情況下本發(fā)明的許多實(shí)施例可以被實(shí)施,本發(fā)明歸屬于以下所附的權(quán)利要求所限定的范圍。
權(quán)利要求
1.一種計(jì)算機(jī)可讀介質(zhì),其具有用數(shù)據(jù)控制用戶界面屬性的計(jì)算機(jī)可執(zhí)行指令,該指令包括創(chuàng)建一個(gè)將目標(biāo)屬性與源數(shù)據(jù)值關(guān)聯(lián)的綁定;以及在接收一個(gè)源數(shù)據(jù)值已經(jīng)歷改變的通知時(shí),基于該綁定在目標(biāo)屬性中反映該改變。
2.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),其中該目標(biāo)屬性包括一個(gè)用戶界面屬性。
3.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),進(jìn)一步包括在目標(biāo)屬性中該反映變化之前將一個(gè)轉(zhuǎn)變應(yīng)用到源數(shù)據(jù)值。
4.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),其中創(chuàng)建綁定包括為綁定指定一個(gè)綁定類型。
5.權(quán)利要求4的計(jì)算機(jī)可讀介質(zhì),其中該綁定類型包括一個(gè)第一綁定類型,當(dāng)該綁定被激活的時(shí)候,該第一綁定類型導(dǎo)致基于源數(shù)據(jù)值而更新該目標(biāo)屬性。
6.權(quán)利要求4的計(jì)算機(jī)可讀介質(zhì),其中該綁定類型包括一個(gè)第二綁定類型,當(dāng)源數(shù)據(jù)值經(jīng)歷變化時(shí),該第二綁定類型導(dǎo)致目標(biāo)屬性被更新。
7.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),進(jìn)一步包括隨著目標(biāo)屬性的目標(biāo)變化更新源數(shù)據(jù)值。
8.權(quán)利要求7的計(jì)算機(jī)可讀介質(zhì),其中更新源數(shù)據(jù)值幾乎立即在目標(biāo)改變之后被異步地執(zhí)行。
9.權(quán)利要求7的計(jì)算機(jī)可讀介質(zhì),其中當(dāng)目標(biāo)屬性失去光標(biāo)時(shí)更新源數(shù)據(jù)值被異步地執(zhí)行。
10.權(quán)利要求7的計(jì)算機(jī)可讀介質(zhì),其中更新源數(shù)據(jù)值由一個(gè)應(yīng)用程序明確地執(zhí)行。
11.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),其中創(chuàng)建綁定用代碼指定。
12.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),其中創(chuàng)建綁定用標(biāo)記語(yǔ)言指定。
13.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),進(jìn)一步包括創(chuàng)建另外一個(gè)綁定,該綁定將目標(biāo)屬性與另一個(gè)源數(shù)據(jù)值相關(guān)聯(lián)。
14.權(quán)利要求1的計(jì)算機(jī)可讀介質(zhì),其中源數(shù)據(jù)值與數(shù)據(jù)源相關(guān)聯(lián)。
15.權(quán)利要求14的計(jì)算機(jī)可讀介質(zhì),其中數(shù)據(jù)源通過(guò)XML上的X路徑、ADO中的列、和反射中的一個(gè)來(lái)指定。
16.一種計(jì)算機(jī)系統(tǒng),其用數(shù)據(jù)控制用戶界面屬性,該計(jì)算機(jī)系統(tǒng)包括處理器;以及存儲(chǔ)器,該存儲(chǔ)器被分配用于多個(gè)計(jì)算機(jī)可執(zhí)行指令,該計(jì)算機(jī)可執(zhí)行指令被裝載到存儲(chǔ)器中用于由處理器執(zhí)行,該計(jì)算機(jī)可執(zhí)行指令執(zhí)行一種方法,包括創(chuàng)建綁定,該綁定將目標(biāo)屬性與一個(gè)源數(shù)據(jù)值相關(guān)聯(lián);以及在接收一個(gè)該源數(shù)據(jù)值已經(jīng)歷一個(gè)變化的通知時(shí),基于該綁定在目標(biāo)屬性中反映該變化。
17.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中目標(biāo)屬性包括一個(gè)用戶界面屬性。
18.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),進(jìn)一步包括在目標(biāo)屬性中反映該變化之前將一個(gè)轉(zhuǎn)變應(yīng)用到源數(shù)據(jù)值。
19.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中創(chuàng)建綁定包括為該綁定指定一個(gè)綁定類型。
20.權(quán)利要求19的計(jì)算機(jī)系統(tǒng),其中該綁定類型包括一個(gè)第一綁定類型,當(dāng)該綁定被激活的時(shí)候,該第一綁定類型導(dǎo)致基于源數(shù)據(jù)值更新目標(biāo)屬性。
21.權(quán)利要求19的計(jì)算機(jī)系統(tǒng),其中該綁定類型包括一個(gè)第二綁定類型,當(dāng)源數(shù)據(jù)值經(jīng)歷變化時(shí),該第二綁定類型導(dǎo)致目標(biāo)屬性被更新。
22.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),進(jìn)一步包括隨著目標(biāo)屬性的目標(biāo)變化更新源數(shù)據(jù)值。
23.權(quán)利要求22的計(jì)算機(jī)系統(tǒng),其中更新源數(shù)據(jù)值幾乎立即在目標(biāo)改變之后被異步地執(zhí)行。
24.權(quán)利要求22的計(jì)算機(jī)系統(tǒng),其中當(dāng)目標(biāo)屬性失去光標(biāo)時(shí)更新源數(shù)據(jù)值被異步地執(zhí)行。
25.權(quán)利要求22的計(jì)算機(jī)系統(tǒng),其中更新源數(shù)據(jù)值由一個(gè)應(yīng)用程序明確地執(zhí)行。
26.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中創(chuàng)建綁定用代碼指定。
27.權(quán)利要求16的計(jì)算機(jī)系統(tǒng),其中創(chuàng)建綁定用標(biāo)記語(yǔ)言指定創(chuàng)建的綁定。
28.一種計(jì)算機(jī)可讀介質(zhì),其具有用數(shù)據(jù)控制用戶界面屬性的計(jì)算機(jī)可執(zhí)行指令,該指令包括一個(gè)邏輯部分,用于操縱應(yīng)用程序中的數(shù)據(jù)值;一個(gè)應(yīng)用程序中的用戶界面部分,該用戶界面部分負(fù)責(zé)顯示用戶界面屬性,該用戶界面部分與邏輯部分相獨(dú)立;以及至少一個(gè)綁定規(guī)范,該綁定規(guī)范描述了用戶界面屬性與數(shù)據(jù)值之間的關(guān)系以至于當(dāng)數(shù)據(jù)值經(jīng)歷變化時(shí)通知系統(tǒng)級(jí)別代碼,以至于系統(tǒng)級(jí)別代碼可以指導(dǎo)用戶界面部分來(lái)反映用戶界面屬性中的變化。
29.權(quán)利要求28的計(jì)算機(jī)可讀介質(zhì),其中使用代碼指定綁定規(guī)范。
30.權(quán)利要求28的計(jì)算機(jī)可讀介質(zhì),其中使用標(biāo)記語(yǔ)言指定綁定規(guī)范。
31.權(quán)利要求28的計(jì)算機(jī)可讀介質(zhì),其中綁定規(guī)范確定一個(gè)源數(shù)據(jù)項(xiàng)、一個(gè)到源數(shù)據(jù)項(xiàng)中數(shù)據(jù)值的路徑、一個(gè)目標(biāo)用戶界面元素、和目標(biāo)用戶界面元素上的用戶界面屬性。
32.權(quán)利要求31的計(jì)算機(jī)可讀介質(zhì),其中該綁定規(guī)范進(jìn)一步確定一個(gè)轉(zhuǎn)換,在用戶界面屬性中反映所述變化之前將該轉(zhuǎn)換應(yīng)用于數(shù)據(jù)值。
33.權(quán)利要求31的計(jì)算機(jī)可讀介質(zhì),其中該綁定規(guī)范進(jìn)一步為綁定確定一個(gè)綁定類型。
34.權(quán)利要求33的計(jì)算機(jī)可讀介質(zhì),其中該綁定類型包括一個(gè)第一綁定類型,當(dāng)該綁定被激活時(shí),該第一綁定類型導(dǎo)致基于數(shù)據(jù)值更新用戶界面屬性。
35.權(quán)利要求33的計(jì)算機(jī)可讀介質(zhì),其中該綁定類型包括一個(gè)第二綁定類型,當(dāng)數(shù)據(jù)值經(jīng)歷變化時(shí),該第二綁定類型導(dǎo)致用戶界面屬性被更新。
36.權(quán)利要求31的計(jì)算機(jī)可讀介質(zhì),其中綁定規(guī)范進(jìn)一步指定當(dāng)用戶界面屬性經(jīng)歷一個(gè)用戶界面改變時(shí),數(shù)據(jù)值被更新。
37.權(quán)利要求36的計(jì)算機(jī)可讀介質(zhì),其中在用戶界面改變之后,數(shù)據(jù)值幾乎立即被異步地更新。
38.權(quán)利要求36的計(jì)算機(jī)可讀介質(zhì),其中當(dāng)用戶界面屬性失去光標(biāo)時(shí),數(shù)據(jù)值被異步地更新。
全文摘要
本發(fā)明描述了一個(gè)用數(shù)據(jù)控制用戶界面(UI)屬性的系統(tǒng)和方法。一個(gè)應(yīng)用程序被分為獨(dú)立的部分,一個(gè)邏輯部分和一個(gè)用戶界面部分。邏輯部分操作應(yīng)用程序中的數(shù)據(jù)值。用戶界面部分負(fù)責(zé)顯示用戶界面屬性。一個(gè)綁定規(guī)范描述了用戶界面屬性與數(shù)據(jù)值之間的關(guān)系。當(dāng)數(shù)據(jù)值經(jīng)歷變化時(shí),系統(tǒng)級(jí)別代碼使用該綁定規(guī)范來(lái)決定被通知的方式以及決定指導(dǎo)用戶界面部分反映用戶界面屬性中的變化的方式。該綁定規(guī)范確定一個(gè)源數(shù)據(jù)項(xiàng),源數(shù)據(jù)項(xiàng)中到數(shù)據(jù)值的一個(gè)路徑,一個(gè)目標(biāo)用戶界面元素,和該目標(biāo)用戶元素上的用戶界面屬性。可以使用代碼或標(biāo)記語(yǔ)言指定該綁定。
文檔編號(hào)G06F13/00GK1620655SQ03801953
公開日2005年5月25日 申請(qǐng)日期2003年5月17日 優(yōu)先權(quán)日2003年5月17日
發(fā)明者S·W·本特, N·庫(kù)普塔, D·J·杰尼, A·I·豪普曼 申請(qǐng)人:微軟公司