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

  • 相关阅读:
    设置装订线
    设置页边距
    查看压缩文件的信息
    格式化3
    格式化2
    条件格式化1
    单独设置奇偶页的页眉页脚
    方法重写注意点
    super注意点
    稀疏数组的压缩和还原
  • 原文地址:https://www.cnblogs.com/oyjj/p/2133011.html
Copyright © 2020-2023  润新知