程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Windows 8實例教程:數據綁定基礎實例

Windows 8實例教程:數據綁定基礎實例

編輯:關於.NET

數據綁定是WPF,Silverlight以及Windows Phone應用開發中最為常用的開發 技術,在基於XAML的Windows Store應用開發中,數據綁定是其開發特性之一,本 文將討論Windows 8應用開發數據綁定的使用。

快速理解數據綁定(Data Binding)

對於應用開發人員而言,無論是應用界面還是應用邏輯往往是為了簡化用戶對 於數據層的操作,通過應用控件實現數據同步更新是最直接最簡單的。但是在實 際項目開發中,復雜的數據結構以及繁瑣的數據操作使應用控件與數據交互難度 增加,對此微軟推出數據綁定實現應用控件直接同步更新數據。簡單理解數據綁 定,創建一個對象實例綁定到指定控件,通過DataContext的依賴關系,當對象實 例數據改變時,同時自動刷新應用控件數據信息。

數據綁定代碼

數據綁定基本代碼格式:

<TextBox Text="{Binding LastName, Mode=TwoWay} "/>

以上代碼實現綁定數據成員LastName到文本框的Text屬性,其中LastName是數 據成員屬性。

實現數據綁定前,首先需要創建綁定數據對象屬性,例如,

public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }

然後在應用運行時,創建數據成員實例,

private void LoadAccount()
        {
            this.DataContext = new Person { FirstName = 

"Kevin", LastName = "Fan", Email = 

"[email protected]" };
        }

這樣既可實現簡單綁定效果:

數據綁定模式

Windows Store應用支持三種數據綁定模式:

OneTime,一次性綁定,該方式只控件運行時第一次綁定數據,此後,數據源 修改控件不在刷新;

OneWay,單向綁定,該方式當數據源更新時,控件同時更新數據,但是當控件 數據更新時,數據源不更新;

TwoWay,雙向綁定,該方式當數據源更新時,控件同時更新數據,而當控件數 據更新時,數據源同樣更新;

對比以上三種模式,TwoWay綁定較為常用,而默認情況下,OneWay是默認值。

在上例中,綁定LastName為TwoWay,雙向模式,即當用戶在控件中修改 “姓”,數據源也同時被修改。

數據綁定實時修改 - INotifyPropertyChanged

數據綁定中,另外一個重要的概念是INotifyPropertyChanged接口,該接口用 於當數據源與對象屬性綁定時,綁定數據源修改,即通知當前UIElement控件並且 更新數據。

例如,在Person.cs中實現INotifyPropertyChanged接口,可以發現該接口僅有 一個事件PropertyChanged,使用RaisePropertyChanged實現該事件,

public class Person : INotifyPropertyChanged
    {
        public string FirstName { get; set; }
    
        private string _lastname;
        public string LastName 
        {
            get { return _lastname; }
            set
            {
                _lastname = value;
                RaisePropertyChanged();
            }
        }
    
        public string Email { get; set; }
    
        private void RaisePropertyChanged([CallerMemberName] string 

caller = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs

(caller));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    }

在綁定頁面添加“更新”button, 其代碼:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    person.LastName = "范";
}

當點擊更新時,Person數據源改變,INotifyPropertyChanged接口通知控件 Text="{Binding LastName, Mode=TwoWay}",修改數據內容。

該接口對於實時數據綁定更新非常有用,在後文將經常使用。

Element數據綁定

上文講述是對象實例與數據源的綁定實例。Windows Store應用同時支持控件 與控件間屬性綁定,例如,實現CheckBox的IsChecked屬性與ProgressRing的 IsActive屬性的綁定,代碼如下:

<Grid Background="{StaticResource 

ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <StackPanel Orientation="Horizontal"
                        HorizontalAlignment="Left">
                <TextBlock Text="運行進度:"
                           VerticalAlignment="Center"
                           Margin="0,0,20,0" />
                <Border BorderThickness="1"
                        BorderBrush="#44000000"
                        Padding="10">
                    <ProgressRing x:Name="ProgressRing1"
                                  IsActive="{Binding IsChecked, 

ElementName=chkRun}" />
                </Border>
            </StackPanel>
            <CheckBox Name="chkRun"
                      Content="運行?" />
        </StackPanel>
    </Grid>

其中綁定代碼中的綁定成員使用Element對象屬性名,並且附加ElementName。

<ProgressRing x:Name="ProgressRing1" IsActive=" {Binding IsChecked, ElementName=chkRun}" />

運行效果如下,選中運行CheckBox,運行進度開始:

數據綁定與數據轉換(Data Converter)

在Windows 8 XAML實例教程中曾講述過數據轉換器的創建和使用,XAML實例教 程系列 - 類型轉換器(Type Converter)

當時代碼是使用VS2012 RC和Windows 8 RP版本創建,所以,本篇代碼進行轉 換到VS2012和Windows 8正式版。

Windows 8數據綁定控件

為了方便應用開發,微軟為開發人員提供了許多數據綁定控件,通過以上綁定 方式設置,可以快速的將數據成員集合綁定到對應控件。

ComboBox控件

前台代碼:

<ComboBox SelectionChanged="cbUserList_SelectionChanged_1" 

DisplayMemberPath="FullName"/>

後台代碼:

public sealed partial class MainPage : Page
    {
        public List<Person> Users { get; set; }
    
        public MainPage()
        {
            this.InitializeComponent();
            LoadUsers();
        }
    
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes 

how this page was reached.  The Parameter
        /// property is typically used to configure the 

page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
    
        private void cbUserList_SelectionChanged_1(object sender, 

SelectionChangedEventArgs e)
        {
            SelectionGrid.DataContext = (e.AddedItems[0] as Person);
        }
    
        private void LoadUsers()
        {
            Users = new List<Person>();
    
            Users.Add(new Person { FirstName = "Kevin", 

LastName = "Fan", Email = "[email protected]" });
            Users.Add(new Person { FirstName = "中國", 

LastName = "銀光", Email = 

"[email protected]" });
            Users.Add(new Person { FirstName = "Mike", 

LastName = "Li", Email = "[email protected]" });
            Users.Add(new Person { FirstName = "Sandy", 

LastName = "Yang", Email = "[email protected]" });
    
            cbUserList.ItemsSource = Users;
        }
    }

查看本欄目

前台代碼:

<ListBox SelectionChanged="lbUserList_SelectionChanged_1" 

ItemsSource="{Binding Users}" 

DisplayMemberPath="FullName"/>

後台代碼:

public sealed partial class MainPage : Page
    {
        public List<Person> Users { get; set; }
    
        public MainPage()
        {
            this.InitializeComponent();
            LoadUsers();
        }
    
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes 

how this page was reached.  The Parameter
        /// property is typically used to configure the 

page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
        }
    
        private void lbUserList_SelectionChanged_1(object sender, 

SelectionChangedEventArgs e)
        {
            SelectionGrid.DataContext = (e.AddedItems[0] as Person);
        }
    
        private void LoadUsers()
        {
            Users = new List<Person>();
    
            Users.Add(new Person { FirstName = "Kevin", 

LastName = "Fan", Email = "[email protected]" });
            Users.Add(new Person { FirstName = "中國", 

LastName = "銀光", Email = 

"[email protected]" });
            Users.Add(new Person { FirstName = "Mike", 

LastName = "Li", Email = "[email protected]" });
            Users.Add(new Person { FirstName = "Sandy", 

LastName = "Yang", Email = "[email protected]" });
    
            lbUserList.ItemsSource = Users;
        }
    }

本篇源代碼:http://files.cnblogs.com/jv9/Win8DataBinding.zip

作者:cnblogs Kevin Fan

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved