WPF编程宝典第19章的数据绑定详解(一)
本文修改自《WPF编程宝典2012》第19章第19.1.1~19.1.3节的内容,因为原书中很多实现的细节未列出,所以自己重新编写了一下代码,更细的的进行补充原书中的遗漏漏。数据库文件,使用使用书中自带的store.sql在SqlServer2008中创建store数据库。
在VS2012中新建一个WPF项目wpf19.1。
第一步:在解决方案中添加一个类库"StoreDatabase"项目,在此项目中分别添加三个类文件,分别是StoreDB.cs、StoreDbDataSet.cs、Product.cs。
Product.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace StoreDatabase
{
public class Product
{
private string modelNumber;
public string ModelNumber
{
get
{
return modelNumber;
}
set
{
modelNumber = value;
}
}
public string modelName;
public string ModelName
{
get { return modelName; }
set { modelName = value; }
}
public decimal unitCost;
public decimal UnitCost
{
get { return unitCost; }
set { unitCost = value;}
}
public string description;
public string Description
{
get { return description; }
set { description = value; }
}
public Product(string modelNumber, string modelName, decimal unitCost, string description)
{
ModelNumber = modelNumber;
ModelName = modelName;
UnitCost = unitCost;
Description = description;
}
}//end class
}
StoreDbDataSet.cs使用来访问本机SqlServer数据库,并返回查询结果集的代码。注释掉的地方是访问XML数据文件的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.IO;
namespace StoreDatabase
{
class StoreDbDataSet
{
public DataTable GetProducts()
{
return ReadDataSet().Tables[0];
}
public DataSet GetCategoriesAndProducts()
{
return ReadDataSet();
}
internal static DataSet ReadDataSet()
{
//访问xml的数据文件
//DataSet ds = new DataSet();
//ds.ReadXmlSchema("store.xsd");
//ds.ReadXml("store.xml");
//return ds;
//访问本机sqlserver数据库
DataSet ds = new DataSet();
string conString = "Password=*******;Persist Security Info=True;User ID=sa;Initial Catalog=store;Data Source=******";
SqlConnection sqlCon = new SqlConnection(conString);
//GetProducts 是数据库中预先设定的“存储过程”
SqlDataAdapter myDataAdapter = new SqlDataAdapter("GetProducts", sqlCon);
myDataAdapter.Fill(ds, "Products");
return ds;
}
}//end class
}//end namespace
StoreDbDataSet.cs中的代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace StoreDatabase
{
public class StoreDB
{
public Product GetProduct(int ID)
{
DataSet ds = StoreDbDataSet.ReadDataSet();
DataRow productRow = ds.Tables["Products"].Select("ProductId=" + ID.ToString())[0];
Product product = new Product((string)productRow["ModelNumber"], (string)productRow["ModelName"],
(decimal)productRow["UnitCost"], (string)productRow["Description"]);
return product;
}
}//end class
}
右键在"解决方案资源管理器"中的类库项目上点击”生成“,则会生成StoreDatabase.dll文件。
第二步:在主启动项目中添加引用 StoreDatabase.dll 文件。
在APP.cs文件中添加代码,添加后的代码如下所示,在全局的APP类中添加公有静态对象storeDB,可以在项目中多窗口中共享使用此对象进行数据获得。
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using StoreDatabase;
namespace Wpf19._1
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
private static StoreDB storeDB = new StoreDB();
public static StoreDB StoreDB
{
get { return storeDB; }
}
}
}
需要绑定数据的XAML窗台的代码:
<Window x:Class="Wpf19._1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BindProductObject" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Margin="7">Product ID:</TextBlock>
<TextBox Margin="5" x:Name="txtID" Grid.Column="1">356</TextBox>
<Button x:Name="cmdGetProduct" Grid.Column="2" Margin="5" Padding="2" Click="cmdGetProduct_Click">Get Product</Button>
</Grid>
<Border Grid.Row="1" Padding="7" Margin="7" Background="LightSteelBlue">
<Grid x:Name="gridProductDetails">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Margin="7" >Model Number:</TextBlock>
<TextBox Margin="5" Grid.Column="1" Text="{Binding Path=ModelNumber}"></TextBox>
<TextBlock Margin="7" Grid.Row="1" >Model Name:</TextBlock>
<TextBox Margin="5" Grid.Column="1" Grid.Row="1" Text="{Binding Path=ModelName}"></TextBox>
<TextBlock Margin="7" Grid.Row="2" >Unit Cost:</TextBlock>
<TextBox Margin="5" Grid.Column="1" Grid.Row="2" Text="{Binding Path=UnitCost}"></TextBox>
<TextBlock Margin="7,7,7,0" Grid.Row="3">Description</TextBlock>
<TextBox Margin="7" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2"
TextWrapping="Wrap" Text="{Binding Path=Description}"></TextBox>
</Grid>
</Border>
</Grid>
</Window>
按钮 Product ID 的click事件处理代码
private void cmdGetProduct_Click(object sender, RoutedEventArgs e)
{
int ID;
if (Int32.TryParse(txtID.Text, out ID))
{
try
{
gridProductDetails.DataContext = App.StoreDB.GetProduct(ID);
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
MessageBox.Show("Invalid ID.");
}
}
浙公网安备 33010602011771号