1. 程式人生 > >WPF入門教程系列十五——WPF中的數據綁定(一)

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

不同 pan cnblogs 雙向 one tap copy msd tac

使用Windows Presentation Foundation (WPF) 可以很方便的設計出強大的用戶界面,同時 WPF提供了數據綁定功能。WPF的數據綁定跟Winform與ASP.NET中的數據綁定功能類似,但也有所不同,在 WPF中以通過後臺代碼綁定、前臺XAML中進行綁定,或者兩者組合的方式進行數據綁定。您可以綁定控件、公共屬性、XML 或對象,WPF中的數據綁定跟WinForm與ASP.NET相比,更加快捷、靈活和簡單。

一、什麽是數據綁定

WPF 中的數據綁定,必須要有綁定目標和要綁定的數據源。綁定目標可以是繼承自 DependencyProperty的任何可訪問的屬性或控件,例如 TextBox 控件的 Text 屬性。數據源可以是其他控件的屬性,可以是對象實例、XAML 元素、ADO.NET Dataset、XML數據。微軟針對XML綁定與對象綁定,提供了兩個輔助類XmlDataProvider 和 ObjectDataProvider。

WPF的數據綁定跟ASP.NET與WinForm中的數據綁定有什麽不同呢? 最大不同就是WPF使用{Binding …}這一語句。

Binding是用來實現界面控件的屬性與後臺數據之間的綁定,通過這種形式將前臺界面與後臺數據聯系在一起達到界面與數據耦合的目的。

WPF綁定引擎從 Binding 對象獲取有關以下內容的信息:

源對象和目標對象。

數據流的方向。你可以通過設置 Binding.Mode 屬性來指定該方向。

值轉換器(如果存在)。你可通過將 Converter 屬性設置為用來實現 IValueConverter 的類的一個實例,指定值轉換器。

WPF與ASP.NET與WinForm中的綁定方式比較,存在著如下幾點差異:

(1)Binding可以通過XAML語句實現界面與數據的耦合。如果把Binding比作數據的橋梁,那麽它的兩端分別是Binding的源和目標。數據從哪裏來哪裏就是源,Binding是架在中間的橋梁,Binding目標是數據要往哪兒去。一般情況下,Binding源是邏輯層的對象,Binding目標是UI層的控件對象,這樣,數據就會源源不斷 通過Binding送達UI層,被UI層展現,也就完成了數據驅動UI的過程。如下圖。

技術分享

(2)Binding有一個重要的屬性Mode,實現綁定中的數據流向。具體有如下幾種。

成員名稱

說明

Default

使用綁定目標的默認 Mode 值。 每個依賴項屬性的默認值都不同。 一般情況下,用戶可編輯控件屬性(例如文本框和復選框的屬性)默認為雙向綁定,而多數其他屬性默認為單向綁定。 確定依賴項屬性綁定在默認情況下是單向還是雙向的編程方法是:使用 GetMetadata 獲取屬性的屬性元數據,然後檢查 BindsTwoWayByDefault 屬性的布爾值。

OneTime

當應用程序啟動或數據上下文更改時,更新綁定目標。 此綁定類型適用於以下情況:使用當前狀態的快照適合使用的或數據狀態實際為靜態的數據。 如果要從源屬性初始化具有某個值的目標屬性,並且事先不知道數據上下文,則也可以使用此綁定類型。 此綁定類型實質上是 OneWay 綁定的簡化形式,在源值不更改的情況下可以提供更好的性能。

OneWay

當綁定源(源)更改時,更新綁定目標(目標)屬性。 此綁定類型適用於綁定的控件為隱式只讀控件的情況。 例如,可以綁定到如股市代號之類的源。 或者,可能目標屬性沒有用於進行更改(例如表的數據綁定背景色)的控件接口。 如果無需監視目標屬性的更改,則使用 OneWay 綁定模式可避免 TwoWay 綁定模式的系統開銷。

OneWayToSource

當目標屬性更改時更新源屬性。

TwoWay

導致對源屬性或目標屬性的更改可自動更新對方。 此綁定類型適用於可編輯窗體或其他完全交互式 UI 方案。

(3)可通過配置觸發器,決定用戶在界面輸入的數據在什麽時候去修改數據源中的值。可以通過UpdateSourceTrigger屬性實現,具體有如下幾種值

成員名稱

說明

Default

綁定目標屬性的默認 UpdateSourceTrigger 值。 大多數依賴項屬性的默認值都為 PropertyChanged,而Text 屬性的默認值為 LostFocus。

確定依賴項屬性的默認 UpdateSourceTrigger 值的編程方法是使用 GetMetadata 來獲取屬性的屬性元數據,然後檢查 DefaultUpdateSourceTrigger 屬性的值。

Explicit

僅在調用 UpdateSource 方法時更新綁定源。

LostFocus

當綁定目標元素失去焦點時,更新綁定源。

PropertyChanged

當綁定目標屬性更改時,立即更新綁定源。

具體用法如下:

<TextBox Name="itemNameTextBox"

         Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />

 

二、簡單的綁定

接下來是本文的第一個示例,一個非常簡單的綁定示例,該示例演示如何通過綁定的方式把ListBox中選中的值顯示到 TextBlock中。

首先,給ListBox添加了七個 ListBoxItem,做為ListBox的選項 。

其次,把第二個 TextBlock 的 Text通過 Binding 與 ListBox 選擇項進行綁定。Binding 語法中的 ElementName 屬性指示 TextBlock 的 Text 屬性要與其綁定的控件的名稱。Path 屬性指示我們將綁定到Text屬性上ListBox元素的屬性。具體代碼如下。

技術分享
<Window x:Class="WpfApp1.WindowBindData"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="WindowBindData" Height="400" Width="500">

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="150"/>

            <RowDefinition Height="150"/>

            <RowDefinition Height="138*"/>

        </Grid.RowDefinitions>

 

        <StackPanel Grid.Row="0">

            <TextBlock Width="248" Height="24" Text="股票名稱:"

        TextWrapping="Wrap"/>

            <ListBox x:Name="listStockName" Width="248" Height="56">

                <ListBoxItem Content="全通教育"/>

                <ListBoxItem Content="大智慧"/>

                <ListBoxItem Content="寶鋼股份"/>

                <ListBoxItem Content="浦發銀行"/>

                <ListBoxItem Content="工商銀行"/>

                <ListBoxItem Content="中國建築"/>

                <ListBoxItem Content="中國南車"/>

            </ListBox>

            <TextBlock Width="248" Height="24" Text="你所選中的股票名稱:" />

            <TextBlock Width="248" Height="24" Text="{Binding ElementName=listStockName, Path=SelectedItem.Content}">

            

            </TextBlock>

        </StackPanel>

 

    </Grid>

   

</Window>
技術分享

效果如下圖。

技術分享

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