標籤:windows phone 8.1 datacontext綁定資料 資料來源改變繫結目標ui上未改變 inotifypropertychang propertychanged
綁定有三種繫結模式,綁定也分UI到UI的綁定和自訂資料來源到UI的綁定。
其中自訂資料來源到UI的綁定是比較複雜的。如果我們利用資料內容DataContext來綁定資料,當我們改變資料來源
資料時,會發現繫結目標UI上對應的資料並沒有發生改變,按理來說採用的是預設綁定OneWay模式,資料來源的更改
應該會導致介面UI的目標屬性發生修改。
這是為什麼呢?因為具體的資料來源屬性並沒有實現更改通知,資料來源資料更改了但是無法通知到目標UI上,通俗點來
講就是,資料來源你自顧自的改動,你不通知一下作為UI的我,我哪裡知道你改動了,我不知道那我就自己不改動嘍。
當然一個問題出現,總會有解決方案的。現在亟待解決的問題就是如何能檢測到資料來源的更改,必須給資料來源實現一
種合適的屬性更改通知機制。
解決方案:資料來源必須實現INotifyPropertyChanged介面,此介面中具有PropertyChanged事件,該事件通知綁定
引擎源已更改,以便綁定引擎可以更新目標值。如果要實現此介面,需要聲明PropertyChanged事件並建立
OnPropertyChanged方法。對於每個需要更改通知的屬性,只要是進行了更新,都需要調用OnPropertyChanged
方法。
範例程式碼如下:
XAML代碼:
<Page x:Class="App1.DataBindDemo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <TextBlock Text="{Binding Test}" FontSize="25" HorizontalAlignment="Center"/> <Button x:Name="change" HorizontalAlignment="Center" Width="300" Content="更改資料來源資料" Click="change_Click"/> </Grid></Page>
.CS代碼:
using System;using System.Collections.Generic;using System.ComponentModel;using System.IO;using System.Linq;using System.Runtime.InteropServices.WindowsRuntime;using Windows.Foundation;using Windows.Foundation.Collections;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Controls.Primitives;using Windows.UI.Xaml.Data;using Windows.UI.Xaml.Input;using Windows.UI.Xaml.Media;using Windows.UI.Xaml.Navigation;// “空白頁”項目範本在 http://go.microsoft.com/fwlink/?LinkID=390556 上有介紹namespace App1{ /// <summary> /// 可用於自身或導航至 Frame 內部的空白頁。 /// </summary> public sealed partial class DataBindDemo : Page { public class TestData:INotifyPropertyChanged { private string test; public string Test { get { return test; } set { test = value; OnPropertyChanged("Test"); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if(handler!=null) { handler(this, new PropertyChangedEventArgs(name)); } } } TestData testData = new TestData() { Test="看,這就是DataContext繫結資料!"}; public DataBindDemo() { this.InitializeComponent(); this.DataContext = testData; } /// <summary> /// 在此頁將要在 Frame 中顯示時進行調用。 /// </summary> /// <param name="e">描述如何訪問此頁的事件數目據。 /// 此參數通常用於配置頁。</param> protected override void OnNavigatedTo(NavigationEventArgs e) { } private void change_Click(object sender, RoutedEventArgs e) { testData.Test = "看,這是新的綁定資料!"; } }}
Windows Phone 8.1中資料繫結之二(綁定資料不變更的解決方案)