2009/7/31

Databinding : Communication between Target and Source

A CodeProject Article

這兩天在網路上到處搜尋有關Databinding的文章,通常找到的東西講的都跟這篇codeproject上的內容一樣。都是講解怎麼樣顯示資料,都沒講到怎麼樣讓這些被顯示的資料可以被使用者變更後記錄起來。

<TextBox Name="Tbx" Text="{Binding Path=Test1}" MouseLeave="Tbx_MouseLeave"></TextBox>

上面這段code,照著文章中的範例可以成功的顯示出,Test1 property在一個class instance中的值。

那要怎麼讓使用者在Textbox中輸入文字後可以改變Test1的值ㄋ?為了找這個答案讓我找的手都長繭,

<TextBox Name="Tbx" Text="{Binding Path=Test1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MouseLeave="Tbx_MouseLeave"></TextBox>

只要加上紅色的部分就可以讓使用者變更Test1的值,藍色的部分可以不加,因為預設就是這個值,要注意的是這只能接收使用者的修改不能反映程式內的修改,要顯式經由程式修改的值,必須實作 INotifyPropertyChanged才行,就像一開始的文章中所說的。至於如何判斷輸入的東西要如何過濾,我不知道,需要再找。

MSDN中UpdateSourceTrigger的說明可以設定的值

2009/7/28

Threadsafe events

http://www.codeproject.com/Articles/37474/Threadsafe-Events.aspx

想做一個功能,很多個thread在不同時間會發出一個event,這些event都由同一個event handler來處理。

因為擔心這樣做不是thread-safe,到處找了很久,在codeproject上找到的這篇是我看到整理最清楚剛好提供了我想知道的資訊。

讀完後的心得:不要在raise event後,讓event handlers有機會離開。

因此有機會出錯的情況是很多個event handler對一個raised event,而很多個raised event對一個event handler則沒有這個問題;另外很多個raised event在event handler內處理時會被block住,一次只處理一個raised event。