WPF TreeView 绑定到层次结构数据库

WPF TreeView 绑定到层次结构数据库

首先在Sql Server中建立下面的层次数据库

instance数据库,包含两个父子表

实例表i1

字段

数据类型

描述

i1_id

int

实例idPK

i1_name

varchar(50)

实例名称

 

子实例表i2

字段

数据类型

描述

i2_id

int

子实例idPK

i1_id

int

所属实例idFK

i2_name

varchar(50)

子实例名称

注意这里要建立两个表的外键关系

使用Visual Studio 2008 建立一个WFP工程,命名为i12

使用Data—>Add New DataSource下的建立一个新的连接,选择Microsoft SqlServer 

填写好数据库的连接信息并测试连接

 

选择数据表

 

 

选择完成,这时,Visual Studio 会自动生成几千行的代码。instanceDataSet.Designer.cs中。

由于这些自动生成的代码是为.net2.0windows Form 所量身定做的。当时还没有考虑的WPF的情况。WPF中要求的对象是要由无参数构造函数完成所有构造的。而instanceDataSet类是一个DataSet类的子类,虽然它含有无参数的构造函数,但是,必须通过相应的强类型表适配器进行填充才能完成构造,因此如果直接在XAML中构造一个instanceDataSet对象由于数据集是空的,所以Treeview中什么都不会有。

解决的方法是使用ObjectDataProvider对象,ObjectDataProvider对象可以以方法或属性的方式提供一个对象,这样我们可以构造一个instanceDataSetProvider类,使它的某个方法CreateInst返回一个填充好的instanceDataSet,再将它作为TreeviewDataContent

其代码如下:

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的另一个好处就是可以在设计时就看到绑定的效果。如下图所示:

原文地址:https://www.cnblogs.com/oyjj/p/2133011.html