第4篇 四步法C#數據綁定


參考資料:

C# WPF 快速開發04數據綁定、列表控件

關於WPF數據綁定簡單介紹及入門

Microsoft Visual C# 2013 Step by Step

http://transbot.blog.163.com/

《四步法完成C#數據綁定》

涉及三個文件:

增加一個類庫文件(.cs文件);這里規定數據倉庫、聲明類並定義屬性

UI文件(.xaml文件);這里完成屬性路徑綁定及單/雙向方式

UI架構器文件(.xaml.cs文件);這里完成界面路徑綁定。

第1步:添加類庫文件,聲明類並定義屬性

在解決方案資源管理器中右鍵項目-->添加類,為項目增加一個作為“綁定源”的數據的類。名字為MyData.cs。MyData由自己定義。這其實就是界面的后台數據倉庫。一個界面可以建一個類,一個界面上不同的控件可以建不同的類,多個界面也可以使用一個類。在綁定時選擇綁定那一個類。

然后在類庫文件中聲明類並定義屬性。對於TextBox控件,希望輸入值改變后數據倉庫同時變化,要加一些語句。代碼如下:

MyData.cs

using System;
using System.Collections.Generic;
using System.ComponentModel; using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudyDisplay
{
    // 第一步:聲明一個類,准備必要的屬性 
    public class DataLib : INotifyPropertyChanged    //注:聲明的類,
    {
        public int _customerID;               //第1個 屬性(開始)
        public int CustomerID
        {
            get { return this._customerID; }
            set { this._customerID = value; }
        }                            //第1個 屬性(結束)
     public string _sampleCircle;            //第2個 屬性(開始)

     public string SampleCircle
     {
       get { return this._sampleCircle; }
       set { this._sampleCircle = value; }
     }
                            //第2個 屬性(結束)
  } 
}

代碼中的粗體語句是因應“內容改變時后台數據同步改變”而添加。編程時,在自動生成的代碼中沒有“using System.ComponentModel;”,“ public class DataLib : INotifyPropertyChanged”的粗體部分會提示有誤,鼠標移至“INotifyPropertyChanged”右鍵-->解析-->添加using System.ComponentModel。

“namespace StudyDisplay”自動使用項目名稱空間

注意屬性里的命名方法,

_customerID
CustomerID

“value”是數據綁定的路徑。

“this.”是界面的路徑。

第2步:在類中實現INotifyPropertyChanged接口

在數據類文件中完成“雙向”的功能。在定義的類中,最后一個屬性下面添加粗體代碼:

public string _sampleCircle;
        public string SampleCircle { get { return this._sampleCircle; } set { this._sampleCircle = value; } } // 第二步:完成“具有雙向的功能” public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }

這是一個方法,里面沒有用戶要編的代碼。OnPropertyChanged方法引發PropertyChanged事件。

PropertyChanged 事件的PropertyChangedEventArgs參數指定了發生改變的屬性的名稱。該值作為參數傳給OnPropertyChanged方法。

第1步中的粗體部分和以上粗體代碼,稱為:在類中實現INotifyPropertyChanged接口

同時,修改Customer類的所有屬性的set訪問器,指定在值被修改時都調用OnPropertyChanged方法。如加粗的部分所示。每個屬性都得添加。

public string _sampleCircle;
        public string SampleCircle
        {
            get { return this._sampleCircle; }
            set 
            { 
                this._sampleCircle = value;
                this.OnPropertyChanged("SampleCircle");
            } 
        }

第3步:屬性路徑綁定。

在xaml文件即界面視圖文件中綁定

代碼如下:

 <!--2-->
        <StackPanel Grid.Row="1" Grid.Column="2"  Style="{StaticResource TheStackPanelStyle}" >
            <StackPanel>
                <Label Style="{StaticResource TheLabeltyle}">采樣周期</Label> 
                <TextBox Style="{StaticResource TheTextBoxStyle}" Name="inputSC" Text="{Binding SampleCircle,Mode=TwoWay}"
                         />   
            </StackPanel>
            <StackPanel>
                <Label Style="{StaticResource TheLabeltyle}">公制/英制</Label>
                <ComboBox Style="{StaticResource TheComboBoxStyle}" Background="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}">
                    <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">公制</ComboBoxItem>
                    <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">英制</ComboBoxItem>
                    <ComboBoxItem Style="{StaticResource ThComboBoxItemStyle}">華制</ComboBoxItem>
                </ComboBox> 
            </StackPanel>
            <StackPanel>
                <Label Style="{StaticResource TheLabeltyle}">采樣周期1</Label>
                <TextBox Style="{StaticResource TheTextBoxStyle}" Name="outputSC" Text="{Binding SampleCircle,Mode=TwoWay}"
                         />
            </StackPanel>

,Mode=TwoWay可以省略。這個指明是單向還是雙向。Mode有四種方式:

OneWay單向:窗口變化則數據變化,數據變化時窗口不會變化。

TwoWay雙向:窗口變化則數據變化,數據變化時窗口也變化。

另外兩種參看參考資料。

第4步:架構路徑綁定。

在界面的代碼隱藏中進行"界面路徑綁定"。綁定完成!

在.xaml.cs文件(MainWindow.xaml.cs)中的MainWindow構造器中添加以下粗體代碼:

     public MainWindow()
        {
            InitializeComponent();
            DataLib dataLib = new DataLib { SampleCircle = "John" 
          CustomerID = 8
       };
       
this.DataContext =
dataLib;
     }

SampleCircle = "John"為初始化賦值。(“CustomerID = 8”僅表示怎樣書寫一系列的初始化賦值,即都寫在這里。)

this.DataContext = customer;該語句指定 MainWindow窗體上的控件 要綁定到哪個對象。窗體上每個控件的 XAML 標記 Text="{ Binding 路徑 }" 都針對該象進行解析。例如, id TextBox和 cId TextBox 控件都指定了 Text="{Binding CustomerID},所以都顯示窗體綁定到的那個對象的  CustomerID 屬性的值。本例設置的是窗體的DataContext屬性,造成窗體上的所有控件都自動應用同一個數據綁定。也可設置單獨控件的DataContext屬性,將不同控件綁定到不同對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM