怎樣進行Wpf 數(shù)據(jù)綁定,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
目前成都創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、靜寧網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
前言:
數(shù)據(jù)綁定的基本步驟:
(1)先聲明一個類及其屬性
(2)初始化類賦值
(3)在C#代碼中把控件DataContext=對象;
(4)在界面設(shè)計里,控件給要綁定的屬性{Binding 綁定類的屬性}
原理:監(jiān)聽事件機制,界面改變有TextChanged之類的事件,所以改變界面可以同步修改到對象
想讓普通對象實現(xiàn)數(shù)據(jù)綁定,需要實現(xiàn)INotifyPropertyChanged接口才能監(jiān)聽ProperChanged。具體代碼如下顯示:
class Person:INotifyPropertyChanged { private int age; public int Age { get { return age; } set { this.age = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Age")); } } } }
BindingMode枚舉值
名稱 | 說明 |
---|---|
OneWay | 當(dāng)源屬性變化時更新目標(biāo)屬性 |
TwoWay | 當(dāng)源屬性變化時更新目標(biāo)屬性,當(dāng)目標(biāo)屬性變化時更新源屬性 |
OneTime | 最初根據(jù)源屬性設(shè)置目標(biāo)屬性,其后的改變會忽略。 |
OneWayToSource | 與OneWay類型相似,但方向相反。 |
Default | 此類綁定依賴于目標(biāo)屬性 |
UpdateSourceTrigger
名稱 | 說明 |
---|---|
Default | 默認(rèn)值,與依賴屬性有關(guān) |
Explicit | 必須在顯示地調(diào)用BindingExpression.UpdateSource的情況下才更新源。 |
LostFocus | 控件失去焦點的時候更新源值 |
PropertyChanged | 綁定的目標(biāo)值改變時更新。 |
實例運行后界面如下:
MainWindow.xaml
首先解釋下C#中的Task.Delay()和Thread.Sleep()
鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)
Thread.Sleep()是同步延遲,Task.Delay()是異步延遲。
Thread.Sleep()會阻塞線程,Task.Delay()不會。
Thread.Sleep()不能取消,Task.Delay()可以。
Task.Delay()實質(zhì)創(chuàng)建一個運行給定時間的任務(wù),Thread.Sleep()使當(dāng)前線程休眠給定時間。
反編譯Task.Delay(),基本上講它就是個包裹在任務(wù)中的定時器。
Task.Delay()和Thread.Sleep()最大的區(qū)別是Task.Delay()旨在異步運行,在同步代碼中使用Task.Delay()是沒有意義的;在異步代碼中使用Thread.Sleep()是一個非常糟糕的主意。通常使用await關(guān)鍵字調(diào)用Task.Delay()。
我的理解:Task.Delay(),async/await和CancellationTokenSource組合起來使用可以實現(xiàn)可控制的異步延遲。
MainWindow.xaml.cs
using System; using System.Collections.ObjectModel; using System.ComponentModel; using System.Threading.Tasks; using System.Windows; namespace WpfApp1 { ////// MainWindow.xaml 的交互邏輯 /// public partial class MainWindow : Window { public ObservableCollectionstuList; public MainWindow() { InitializeComponent(); this.DataContext = new Student() { Name="111", Id =1 }; Task.Run(async() => //開啟異步線程task { await Task.Delay(3000); //延時3秒 Dispatcher.Invoke((Action)delegate //線程中主界面顯示需要用委托,不然這次賦值,在界面不更新 { this.DataContext = new Student() { Name = "222", Id = 2 }; }); }); this.DataContext = new Student() { Name = "333" , Id = 3 }; } private void BtnCtrl1_Click(object sender, RoutedEventArgs e) { Student stu = new Student() { Id = 4, Name = "Jon", Age = 29 }; //實例化一個Student類 并給類成員賦值 this.DataContext = stu;//將實例化得對象傳給DataContext } private void BtnCtrl2_Click(object sender, RoutedEventArgs e) { ObservableCollection stuList = new ObservableCollection () //具有通知屬性的list { new Student() { Id=5, Name="Tim", Age=29 }, new Student() { Id=6, Name="Tom", Age=28 }, }; this.listBox1.ItemsSource = stuList; this.listBox2.ItemsSource = stuList; this.listBox2.DisplayMemberPath = "Name"; this.DataContext = stuList; } } public class Student : INotifyPropertyChanged //創(chuàng)建一個繼承自INotifyPropertyChanged的類Student { private string name; public string Name { get { return name; } set { name = value; if (this.PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("Name")); //給Name綁定屬性變更通知事件 } } } private int id; public int Id { get { return id; } set { id = value; if (this.PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Id"));//給Id綁定屬性變更通知事件 } } } private int age; public int Age { get { return age; } set { age = value; if (this.PropertyChanged != null) { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));//給Age綁定屬性變更通知事件 } } } public int ID { get; internal set; } public event PropertyChangedEventHandler PropertyChanged; } }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。