天天看點

為什麼databindings在綁定到屬性值的時候,不能自動更新

在面向對象設計系統的時候,在設計的類的生成對象的後,為了呈現給客戶,要綁定對象的屬性到窗體,

這時我們可以使用控件的databindings方法,如

textbox1.databindings.add("text", cat, "name");

這樣在textbox1中輸入相應的資訊後,cat的name屬性就會自然發生變化,這時,我們可以将這個對象持久化到資料庫中,或者文本,及本地資源中

但是一般來說,我們的系統涉及到的業務邏輯不會這麼簡單(隻是資料庫的存儲)

舉一個例子,我們在買東西的時候,在修改購買量的時候,我們希望在我們輸入數量後,系統自動顯示出總價來

以下是一個簡單的例子,這時我們在寫程式的時候,無論修改那個量,都可以得到正确的總價

label1.databindings.add("text",obj,"itemsmoney");

但是:我們将總價綁定到了label1,在總價發生變化後,label1的text屬性是不發生變化的,為什麼呢,因為databinding不自動探測對象中屬性值的變化

這樣看上去,像是做了一半的工作,這個databindings看起來就不那麼完美了

public class shopitem

{

    int price;

    int totalmoney;

    int num;

    public int price

    {

        get{return price;}

        set

        {

            if(price!=value)

            {

                totalmoney=price*number;

                price=value;

            }

        }

    }

    public int number

        get{}

            if(num!=value)

                num=value;

    public int itemsmoney

        get

            return totalmoney;

}

通過反射檢視一下databindings的實作機制,起主要做用的就是binding類了,他通過反射取得對象的值,并指派在控件的相應的屬性上

[typeconverter(typeof(listbindingconverter))]

public class binding

我們在程式中修改已經綁定了對象屬性值的控件的值,對象的屬性值是不會發生變化,說明binding捕獲的是使用者的輸入消息,如wm_char,滑鼠,等消息

現在我們來看一下,為什麼不自動更新界面資訊

如果我們要實作這個自動更新的功能,那麼,屬性值在發生變化時,必須産生一個消息,由binding處理,然後重新整理界面

産生這個消息,我隻想到兩種方法

第一,修改property的實作機制,property的實作用類似方法的機制實作的,我不懂il是以不知道實作起來有沒有困難,反正現在是沒有

第二,在每一個屬性修改時都引發一個event,然後将這個event交給binding處理

第二種方法,先不說他的代碼量,在每一個property中都加入引發事件的語句

單是如何處理就是一個問題

這個binding必須必理所有的對象的屬性變化,就是在每一個對象的建立時,都必須将他的propertychaged事件的處理函數交給databing處理,

那麼這個binding就是一個全局的靜态方法,(有可能會引發線程通路的問題),如果使用對象的話,那麼在每一個類中都加入一個顯示的部分,那麼

業務邏輯與界面顯示不完全分離,并且,開銷也非常巨大,如果使用池的緩存機制,這樣可能會減少一些開銷.

所有隻有選一個折中的辦法,定義一個inotifypropertychanged接口,

那麼,你想怎麼辦就怎麼辦吧

inotifypropertychanged接口實作的例子