WPF TreeView 绑定到层次结构数据库
首先在Sql Server中建立下面的层次数据库
instance数据库,包含两个父子表
实例表i1
字段 |
数据类型 |
描述 |
i1_id |
int |
实例id(PK) |
i1_name |
varchar(50) |
实例名称 |
子实例表i2
字段 |
数据类型 |
描述 |
i2_id |
int |
子实例id(PK) |
i1_id |
int |
所属实例id(FK) |
i2_name |
varchar(50) |
子实例名称 |
注意这里要建立两个表的外键关系
使用Visual Studio 2008 建立一个WFP工程,命名为i12
使用Data—>Add New DataSource下的建立一个新的连接,选择Microsoft SqlServer
填写好数据库的连接信息并测试连接
选择数据表
选择完成,这时,Visual Studio 会自动生成几千行的代码。instanceDataSet.Designer.cs中。
由于这些自动生成的代码是为.net2.0的windows Form 所量身定做的。当时还没有考虑的WPF的情况。WPF中要求的对象是要由无参数构造函数完成所有构造的。而instanceDataSet类是一个DataSet类的子类,虽然它含有无参数的构造函数,但是,必须通过相应的强类型表适配器进行填充才能完成构造,因此如果直接在XAML中构造一个instanceDataSet对象由于数据集是空的,所以Treeview中什么都不会有。
解决的方法是使用ObjectDataProvider对象,ObjectDataProvider对象可以以方法或属性的方式提供一个对象,这样我们可以构造一个instanceDataSetProvider类,使它的某个方法CreateInst返回一个填充好的instanceDataSet,再将它作为Treeview的DataContent。
其代码如下:
namespace i12
{
public class instanceDataSetProvider
{
/// <summary>
/// 初始化数据集
/// </summary>
instanceDataSet inst=new instanceDataSet();
/// <summary>
/// 初始化表适配器
/// </summary>
instanceDataSetTableAdapters.i1TableAdapter i1TA = new i12.instanceDataSetTableAdapters.i1TableAdapter();
instanceDataSetTableAdapters.i2TableAdapter i2TA = new i12.instanceDataSetTableAdapters.i2TableAdapter();
public instanceDataSet CreateInst()
{
///使用表适配器填充数据集
i1TA.Fill(inst.i1);
i2TA.Fill(inst.i2);
///返回填充后的数据集
return inst;
}
}
}
对应的XAML文件如下
<Window x:Class="i12.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:i12"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ObjectDataProvider x:Key="inst1" ObjectType="{x:Type local:instanceDataSetProvider}" MethodName="CreateInst" />
<DataTemplate x:Key="tmp_i2" >
<TextBlock Text="{Binding i2_name}" />
</DataTemplate>
<HierarchicalDataTemplate x:Key="tmp_i1" ItemsSource="{Binding FK_i2_i1}" ItemTemplate="{StaticResource tmp_i2}" >
<TextBlock Text="{Binding i1_name}" />
</HierarchicalDataTemplate>
</Window.Resources>
<Grid DataContext="{StaticResource inst1}">
<TreeView Margin="28,31,130,31" Name="treeView1" ItemsSource="{Binding i1}" ItemTemplate="{StaticResource tmp_i1}" />
</Grid>
</Window>
而使用ObjectDataProvider的另一个好处就是可以在设计时就看到绑定的效果。如下图所示: