WPF 數據綁定Binding

什麼是數據綁定?

Windows Presentation Foundation (WPF) 數據綁定爲應用程序提供了一種簡單而一致的方法來顯示數據以及與數據交互。html

經過數據綁定,您能夠對兩個不一樣對象的屬性值進行同步。——MSDNweb

 什麼意思呢?先能夠這樣理解,數據綁定是一種行爲,這個行爲能夠將多個對象的屬性顯示在UI上,當用戶修改了UI上的值以後(固然必須是要看實際狀況),對應的屬性值也被改變,從而達到數據交互的目的。看一下MSDN上的一幅圖(感受這幅圖處處都能看見(偷笑)):app

Binding能夠經過XAML語句實現界面與數據的耦合。若是把Binding比做數據的橋樑,那麼它的兩端分別是Binding的綁定目標和綁定源。數據從哪裏來哪裏就是源,Binding是架在中間的橋樑,Binding目標是數據要往哪兒去。通常狀況下,綁定源是邏輯層的對象,綁定目標是UI層的控件對象,這樣,數據就會源源不斷經過Binding送達UI層,被UI層展示,也就完成了數據驅動UI的過程。——參考《WPF中的數據綁定ide

從上圖能夠看出數據綁定的4個組件,爲方便理解,結合例子:將TextBox的內容綁定到Employee對象的Name屬性,也就是說把Name的值顯示在TextBox上:ui

  1. 綁定目標對象TextBox
    綁定目標對象能夠是全部UIElement對象。爲何?這是天然而然的事情。數據綁定就是爲了將數據與UI進行交互,那麼綁定的這種行爲必然正對全部UIElement對象,例如常見的Button,TextBlock等等。
  2. 目標屬性:TextBox的Text屬性
  3. 目標屬性必須是依賴項屬性。爲何呢?在WPF中,只有這樣的屬性才支持數據綁定,這也就意味着不能綁定字段。不過,在WPF中UIElemnt對象的大部分屬性都是依賴屬性且大多數依賴屬性都是支持數據綁定的。爲何呢?從《WPF依賴屬性》中能夠知道,只有DependencyObject類型能夠定義依賴項屬性,而全部UIElement對象都是從DependencyObject派生的。
  4. 綁定源對象:Employee對象

    綁定源的對象能夠有哪些呢?WPF支持CLR對象和XML形式的數據:UIElement、任何列表對象、與ADO.NET數據或Web服務關聯的CLR對象、包含XML數據的XmlNode.spa

  5. 綁定源值的path(這個從圖中看不出來,但能夠想象的出來,^_^):Name

如何綁定?

根據實際應用的狀況,綁定目標基本上都是UI對象,咱們來看一下綁定數據的各類狀況:code

一、綁定UI對象
舉一個簡單例子,選擇ComboBox下拉列表中的性別,並顯示在TextBlock中。orm

xaml:htm

<StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">
    <TextBox x:Name="tbk"  Width="100" Height="40" Background="#FFF2F2F2" VerticalAlignment="Top"  TextAlignment="Center" FontSize="24"
                 Text="{Binding ElementName=combo,Path=SelectedItem.SexName}"/>
    <ComboBox x:Name="combo"  Width="100" Height="30" Margin="10" 
                      DisplayMemberPath="SexName" SelectedValuePath="SexId" SelectedIndex="1"/>
</StackPanel>

cs,主要是給ComboBox賦數據源:對象

    public partial class MainWindow : Window
    {
        List<SexType> _sexCollection;
        public MainWindow()
        {
            InitializeComponent();
            _sexCollection = new List<SexType>()
            {
                new SexType(){SexId=1,SexName=""},
                new SexType(){SexId=2,SexName=""},
                new SexType(){SexId=3,SexName="未知"}
            };
            combo.ItemsSource = _sexCollection;
        }
    }

    public class SexType
    {
        public int SexId { get; set; }
        public string SexName { get; set; }
    }

由上述例子能夠看出,綁定目標:TextBox,目標屬性:TextBox.Text,綁定源對象:combo,綁定源值的Path:combo.SelectedItem.SexName.箇中滋味能夠自行感覺。

 

二、上面這個例子中comboBox的數據源是在cs中經過」combo.ItemsSource=數據源「來賦值的,那麼是否能夠經過綁定數據的方式來賦值呢?答案必須是確定的。

咱們知道ComboBox和ListBoxItem都是ItemsControl的派生類,而對於全部的ItemsControl對象都有一個ItemsSource的依賴屬性。ItemsSource的類型是IEnumerable,因此集合類型能夠成爲它綁定的對象。

<ComboBox x:Name="combo"  Width="100" Height="30" Margin="10" 
                      DisplayMemberPath="SexName" SelectedValuePath="SexId" SelectedIndex="1"
                      ItemsSource="{Binding _sexCollection}"/> 

在修改一下cs文件:

    public partial class MainWindow : Window
    {
        public List<SexType> _sexCollection;
        public MainWindow()
        {
            InitializeComponent();
            _sexCollection = new List<SexType>()
            {
                new SexType(){SexId=1,SexName=""},
                new SexType(){SexId=2,SexName=""},
                new SexType(){SexId=3,SexName="未知"}
            };
            //combo.ItemsSource = _sexCollection;
        }
    }

能夠看到是沒有數據源的,也就是說根本就沒有把數據綁到ComboBox上:

這是爲何呢?依賴屬性內的垂直通知功能讓UI對相間的綁定能夠本身負責同步處理,可是對於.NET集合或對象來說,就不具有這樣的能力了。爲了讓目標屬性與源目標保持同步,源目標必須實現一個叫INotifyPropertyChanged的接口。

 

一般咱們只需將集合繼承於ObservableCollection類便可。

 

 

 

 

二、綁定集合

三、數據模板

四、爲綁定添加規則及轉換器

如何綁定不一樣的源。

相關文章
相關標籤/搜索