最近和朋友合作一個應用,開發的時候遇到兩個問題,第一個是ListBox控制項的多選問題,第二個是PhotoChooserTask選取器和Image控制項 的配合問題。巧合的是,近日有讀者在我的部落格裡提到他也遇到第二個問題,因此,我想在這篇文章裡分享一下如何使用附加屬性和 Expression Blend行為解決這兩個問題。
如何綁定ListBox控制項的SelectedItems屬性?
當我們把SelectionMode屬性的值設為 Multiple時,ListBox控制項就能支援多選了,如圖1所示,此時,我們可以通過ListBox控制項的SelectedItems屬性擷取選中的項。接下來,我很 自然就會想到把ListBox控制項的ItemsSource和SelectedItems兩個屬性分別綁到視圖模型的對應屬性,但是,SelectedItems屬性不是相依性屬性 ,無法進行資料繫結,怎麼辦?
圖 1
既然內建的SelectedItems屬性不支援資料繫結,我們就自己建立一個支援資料繫結的吧。在Silverlight裡,我們可以 通過附加屬性擴充依賴對象,比如說,我們可以在ListBox控制項上設定Grid.Row附加屬性,如代碼1所示。
代碼 1
Grid.Row附加屬性不 是ListBox控制項的屬性,卻被用來附加額外的資料。在ListBox控制項上設定Grid.Row附加屬性本身不會產生什麼效果,但是,當我們把這個 ListBox控制項放在一個Grid裡時,這個Grid將會根據Grid.Row附加屬性的值安排ListBox控制項的位置,這是附加屬性的常見用途。
回到 我們的問題,我希望建立一個SelectedItems附加屬性,作為內建的SelectedItems屬性和視圖模型對應的屬性之間的橋樑,如代碼2所示。當 我們把SelectedItems附加屬性綁到視圖模型的對應屬性時,前者會把後者的資料添加到內建的SelectedItems屬性。當使用者在使用者介面上更改 選中的項時,SelectedItems附加屬性會把資料更新回視圖模型的對應屬性。
代碼 2