經過上一文章中的示例,學習了簡單的綁定方式。在這裏的示例,要學習一下綁定的模式,和模式的使用效果。app
首先,咱們來作一個簡單示例,這個示例是根據ListBox中的選中項,去改變TextBlock的背景色。將 TextBlock 的背景色綁定到在 ListBox 中選擇的顏色。在下面的代碼中針對TextBlock的 Background 屬性使用綁定語法綁定從 ListBox 中選擇的值。代碼以下。學習
<StackPanel Grid.Row="1"> <TextBlock Width="248" Height="24" Text="顏色:" TextWrapping="Wrap"/> <ListBox x:Name="listColor" Width="248" Height="56"> <ListBoxItem Content="Blue"/> <ListBoxItem Content="Red"/> <ListBoxItem Content="Green"/> <ListBoxItem Content="Gray"/> <ListBoxItem Content="Cyan"/> <ListBoxItem Content="GreenYellow"/> <ListBoxItem Content="Orange"/> </ListBox> <TextBlock Width="248" Height="24" Text="改變背景色:" /> <TextBlock Width="248" Height="24" Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"> </TextBlock> </StackPanel>
若是用戶在 ListBox 中選擇了一種顏色,那麼TextBlock 的背景色會變爲選定的顏色(如下圖1)。spa
圖1code
接下來咱們對上面的示例進行一些修改:orm
1) 同一個數據源綁定到兩個或多個控件上。如咱們的示例中把ListBox的選中項綁定到TextBox與TextBlock。對象
2) 在綁定語法中增長一個 Mode 屬性,即綁定模式。對於咱們的示例,咱們把TextBlock的綁定語法中的Mode屬性設爲 OneWay 。把TextBox的綁定語法中的Mode屬性設爲TwoWay。blog
對於示例中的Mode進行一下簡單說明(具體能夠參見前一篇):ci
1)使用 OneWay 綁定時,每當數據源(ListBox)發生變化時,數據就會從數據源流向目標(TextBlock)。it
2)OneTime 綁定也會將數據從源發送到目標;可是,僅當啓動了應用程序或 DataContext 發生更改時纔會如此操做,所以,它不會偵聽源中的更改通知。io
3)OneWayToSource 綁定會將數據從目標發送到源。
4)TwoWay 綁定會將源數據發送到目標,但若是目標屬性的值發生變化,則會將它們發回給源。
下面就是修改後的示例代碼,功能是將 TextBlock (OneWay) 和 TextBox (TwoWay) 綁定到 ListBox 的代碼:
<StackPanel Grid.Row="1"> <TextBlock Width="248" Height="24" Text="顏色:" TextWrapping="Wrap"/> <ListBox x:Name="listColor" Width="248" Height="56"> <ListBoxItem Content="Blue"/> <ListBoxItem Content="Red"/> <ListBoxItem Content="Green"/> <ListBoxItem Content="Gray"/> <ListBoxItem Content="Cyan"/> <ListBoxItem Content="GreenYellow"/> <ListBoxItem Content="Orange"/> </ListBox> <TextBlock Width="248" Height="24" Text="改變背景色:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}" Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"> </TextBlock> <TextBox Name="txtTwoWay" Text="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}" Background="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"></TextBox> </StackPanel>
圖 2
在上述示例中,對TextBlock使用了 OneWay 綁定模式,由於我但願只有當選擇了 ListBox 中的某一項以後,應用程序將選定的 ListBoxItem(數據源)發送到 TextBlock。我不但願 TextBlock 的變動會影響到 ListBox中的內容。
我對TextBox使用 TwoWay 綁定模式,由於我但願用戶在 ListBox 中選擇一種顏色後,該顏色就會顯示在 TextBox 中,而且其背景色也會隨之相應變化。若是該用戶在 TextBox 中鍵入了一種顏色(例如Pink),ListBox 中剛纔選中的顏色名稱就會被更新(即從目標到數據源),當鼠標再次點擊這條修改後的數據時,新值就會被再次發送到TextBox上。這意味着 TextBlock 也會隨之改變。(請參見圖 2)。
若是我將 TwoWay 模式改回到 OneWay,用戶則能夠編輯 TextBox 中的顏色,可是不會將TextBox中輸入的值去替換ListBox中選中項的值。
綁定模式如何應用呢?下面是我的的一點看法:
1)當只想讓用戶看到數據,而不但願用戶去修改數據時,能夠採用 OneWay 模式,相似winform中的只讀屬性。
2)當但願用戶能夠對控件中的數據進行修改,同時讓用戶修改的數據更新到數據源(DataSet、對象、XML 或其餘綁定控件)中時,可使用 TwoWay 綁定。
3)若是想讓用戶修改數據源中的數據,而又不想使用TowWay模式,就可使用 OneWayToSource 綁定。OneWayToSource模式容許經過在原來被看做是綁定源的對象中放置綁定表達式,從而翻轉源和目標。
4)當你的界面中的一系列只讀控件均被綁定了數據,而且當用戶刷新了數據源時,但願綁定控件中的值仍保持不變,可使用 OneTime 綁定。此外,當源沒有實現 INotifyPropertyChanged 時,OneTime 綁定模式也是一個不錯的選擇。
說明:綁定目標中的修改什麼時候去修改數據源
在上面的例子中,TextBox 使用了 TwoWay 綁定模式,因此當TextBox 失去焦點時WPF會使用TextBox中的值改變ListBox中的值。若是你不想在TextBox失去焦點時,就去修改ListBox中的值,能夠爲 UpdateSourceTrigger 指定值,它是用於定義什麼時候更新源的綁定屬性。能夠爲 UpdateSourceTrigger 設置三個值:Explicit、LostFocus 和 PropertyChanged。
若是將 UpdateSourceTrigger 設置爲 Explicit,則不會更新源,除非從代碼中調用 BindingExpression.UpdateSource 方法。設置爲LostFocus ,(TextBox 控件的默認值)指示數據源綁定的控件失去焦點時纔會更新。PropertyChanged 值綁定控件的綁定屬性每次發生更改時就去更新數據源中的值。