WPF入門教程系列十六——WPF中的數據綁定(二)

3、綁定模式

    經過上一文章中的示例,學習了簡單的綁定方式。在這裏的示例,要學習一下綁定的模式,和模式的使用效果。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 值綁定控件的綁定屬性每次發生更改時就去更新數據源中的值。

相關文章
相關標籤/搜索