Binding及與之配套的數(shù)據(jù)轉(zhuǎn)換和校驗(yàn)是WPF的核心。一些詳細(xì)的只是介紹,園子里到處都是,這里DebugLZQ不再贅述。
首先回顧下WPF常用的Binding數(shù)據(jù)源
經(jīng)典的例子如下:
<TextBox Height="23" HorizontalAlignment="Left" Margin="28,42,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Value,ElementName=slider1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> <Slider Height="23" HorizontalAlignment="Left" Margin="28,94,0,0" Name="slider1" VerticalAlignment="Top" Width="225" />
重點(diǎn)是這里:
Text="{Binding Path=Value,ElementName=slider1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
控件的屬性與一個(gè)內(nèi)存Object綁定,該對(duì)象所在類實(shí)現(xiàn)IPropertyChanged接口
using System.ComponentModel;//namespace Binding{ class Machine:INotifyPropertyChanged { #region INotifyPropertyChanged 成員 public event PropertyChangedEventHandler PropertyChanged; #endregion private int temperature; public int Temperature { get { return temperature; } set { temperature = value; //引發(fā)事件 if (PropertyChanged != null) { PropertyChanged.Invoke(this, new PropertyChangedEventArgs("temperature")); } } } }}
頁面布局如下:
using System.Windows;using System.Windows.Controls;using System.Windows.Data;namespace Binding{ /// <summary> /// Window2.xaml 的交互邏輯 /// </summary> public partial class Window2 : Window { Machine machine; public Window2() { InitializeComponent(); //數(shù)據(jù)源 machine = new Machine(); //Binding System.Windows.Data.Binding binding = new System.Windows.Data.Binding(); binding.Source = machine; binding.Path = new PropertyPath("Temperature"); // BindingOperations.SetBinding(textBox1, TextBox.TextProperty, binding); } private void button1_Click(object sender, RoutedEventArgs e) { System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 500; timer.Enabled = true; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { machine.Temperature++; } }}
不去多說,前面的博文中有類似的
即從數(shù)據(jù)庫獲得一個(gè)DataTable對(duì)象, Binding到DataGrid或ListView。
自定義數(shù)據(jù)庫表定義如下:
//----------直接DataTable數(shù)據(jù)源-------------------------------------DataTable dataTable = SQLHelper.GetDataTable();dataGrid1.ItemsSource = dataTable.DefaultView;
SQLHelper類如下,該靜態(tài)類之定義了一個(gè)方法用來獲得一個(gè)DataTable,下面的LINQ數(shù)據(jù)源使用相同的SQLHelper.GetDataTable()方法。
using System.Data.SqlClient;using System.Data;namespace Binding{ class SQLHelper { public static string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\VS2010Pros\Binding\Binding\Database1.mdf;Integrated Security=True;User Instance=True"; public static DataTable GetDataTable() { using (SqlConnection conn = new SqlConnection(connstring)) { string sql = @"select Id,Name,Age from tb_Student"; SqlDataAdapter sda = new SqlDataAdapter(sql, conn); DataTable dt = new DataTable(); sda.Fill(dt); return dt; } } }}
在xaml中加入Binding,DataGrid控件定義如下:
<DataGrid AutoGenerateColumns="False" Height="130" HorizontalAlignment="Left" Margin="24,16,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="230" > <DataGrid.Columns> <DataGridTextColumn Header="Id" Width="60" Binding="{Binding Id}"/> <DataGridTextColumn Header="Name" Width="100" Binding="{Binding Name}"/> <DataGridTextColumn Header="Age" Width="60" Binding="{Binding Age}"/> </DataGrid.Columns> </DataGrid>
結(jié)果如下(因?yàn)镈ebugLZQ現(xiàn)在開啟的是XP系統(tǒng),所以界面有點(diǎn)丑):
主要是LINQ to DataSet 和LINQ to SQL。
首先是LINQ to DataSet Binding到ListView。其中的dataTable獲取方法和上面的一樣。
//----------Linq to DataSet數(shù)據(jù)源---------------------------------------- var query = from row in dataTable.Rows.Cast<DataRow>() where Convert.ToString(row["Name"]).StartsWith("D") select new { Id=int.Parse(row["Id"].ToString()), Name=row["Name"].ToString(), Age = int.Parse(row["Age"].ToString()) }; listView1.ItemsSource = query;
ListView 定義及Binding如下:
<ListView Height="100" HorizontalAlignment="Left" Margin="24,173,0,0" Name="listView1" VerticalAlignment="Top" Width="224" > <ListView.View> <GridView> <GridViewColumn Header="Id" Width="60" DisplayMemberBinding="{Binding Id}"/> <GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Name}"/> <GridViewColumn Header="Age" Width="60" DisplayMemberBinding="{Binding Age}"/> </GridView> </ListView.View> </ListView>
結(jié)果如下:
下面給是LINQ to SQL 數(shù)據(jù)源Binding到DataGrid控件。
用來映射tb_Student表的Student類定義如下:
using System.Data.Linq.Mapping;namespace Binding{ [Table(Name="tb_Student")] class Student { [Column(IsPrimaryKey = true, DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true, Name = "Id")] public int Id { get; set; } [Column(DbType = "nvarchar(20)", Name = "Name")] public string Name { get; set; } [Column(DbType = "int", Name = "Age")] public int Age { get; set; } }}
對(duì)數(shù)據(jù)源的LINQ操作如下,隨便寫了一個(gè):
//---------Linq to SQL 數(shù)據(jù)源------------------------------------System.Data.Linq.DataContext dc = new System.Data.Linq.DataContext(SQLHelper.connstring );var students= dc.GetTable<Student>();var query_2 = from s in students where s.Name.Contains("D") select s;dataGrid2.ItemsSource = query_2;
DataGrid 定義及Binding如下:
<DataGrid AlternatingRowBackground="#FFAACC0B" AutoGenerateColumns="False" Height="130" HorizontalAlignment="Left" Margin="267,74,0,0" Name="dataGrid2" VerticalAlignment="Top" Width="230"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Id}" Header="Id" Width="60" /> <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="100" /> <DataGridTextColumn Binding="{Binding Age}" Header="Age" Width="60" /> </DataGrid.Columns> </DataGrid>
程序運(yùn)行結(jié)果如下:
聯(lián)系客服