第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属性,将不同控件绑定到不同对象。

 

posted @ 2015-10-31 17:36  moiska  阅读(7207)  评论(1编辑  收藏  举报