0

我想要树视图

可以是编程,烹饪,其他的书籍。可以是 CD 或 DVD 的光盘。书籍和光盘有 Good_type_id。必须有我创建的数据库中的结构。

Book
  Programming
  Cooking
  Other
Disc
  CD 
  DVD

会有另一种类型的光盘和一些额外的书籍参数,但不在本主题中。我的结果是

Book
  Programming
  Cooking
  Other
Disc

我希望 HierarchicalDataTemplate 不仅适用于书籍类型,而且适用于光盘类型。我不知道如何在一个treevie中做到这一点。这是代码。在树视图中会有一些嵌套项或加入 sql 代码,但不在本主题中。我创建了 2 个关系。通过 [Good_Type_Id] 工作的书籍之一。我想在一个树视图中的光盘也一样。

CREATE TABLE [dbo].[Book_type] (
[Good_Type_Id] [varchar] (50) NOT NULL,
[Book_Type_Id] [varchar] (50) NOT NULL,
[Book_Type_Name] [varchar] (50) NOT NULL,
) ON [PRIMARY]
GO

INSERT INTO [dbo].[Book_type] VALUES  ('1','1b','Programming');
INSERT INTO [dbo].[Book_type] VALUES  ('1','2b','Cooking');
INSERT INTO [dbo].[Book_type] VALUES  ('1','3b','Other_Book');


CREATE TABLE [dbo].[Disc_type] (
[Good_Type_Id] [varchar] (50) NOT NULL,
[Disc_Type_Id] [varchar] (50) NOT NULL,
[Disc_Type_Name] [varchar] (50) NOT NULL,
) ON [PRIMARY]
GO

INSERT INTO [dbo].[Disc_type] VALUES  ('2','1d','CD');
INSERT INTO [dbo].[Disc_type] VALUES  ('2','2d','DVD');



namespace Test
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            try
            {
                this.GoodTreeView.DataContext = Test.CreateDataRelation();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message); 
            }
        }
    }
}
    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Test
{
    public static class Test
    {
        #region

        /// <summary>
        /// Data Relation Between Two Tables Such as good_type and Goods
        /// </summary>
        /// <returns>DataSet</returns>
        public static DataSet CreateDataRelation()
        {
            try
            {
                SqlConnection SqlCon = new SqlConnection();
                SqlCon.ConnectionString = @"Data Source=(local);DATABASE=Test;Integrated Security=SSPI";
                SqlCon.Open();

                //SqlDataAdapter Sql_Good_Type_Da = new SqlDataAdapter("SELECT Good_Type_Id,Good_Type_Name from Good_Type", SqlCon);
                SqlDataAdapter Sql_Good_Type_Da = new SqlDataAdapter("SELECT * from Good_Type", SqlCon);
                //SqlDataAdapter Sql_Book_Type_Da = new SqlDataAdapter("SELECT Good_type_Id, Book_Type_Id, Book_type_Name from Book_type", SqlCon);
                SqlDataAdapter Sql_Book_Type_Da = new SqlDataAdapter("SELECT * FROM Book_type", SqlCon);
                SqlDataAdapter Sql_Disc_Type_Da = new SqlDataAdapter("SELECT * FROM Disc_type", SqlCon);
                DataSet Ds = new DataSet();
                Sql_Good_Type_Da.Fill(Ds, "Good_Type");
                Sql_Book_Type_Da.Fill(Ds, "Book_Type");
                Sql_Disc_Type_Da.Fill(Ds, "Disc_Type");


                DataRelation Dr_Good_Book = new DataRelation
                    ("Good_Book_Relation",
                    Ds.Tables["Good_Type"].Columns["Good_Type_Id"],
                    Ds.Tables["Book_Type"].Columns["Good_Type_Id"],
                    true
                    );

                DataRelation Dr_Good_Disc = new DataRelation
                    ("Good_Disc_Relation",
                    Ds.Tables["Good_Type"].Columns["Good_Type_Id"],
                    Ds.Tables["Disc_Type"].Columns["Good_Type_Id"],
                    true
                    );


                Dr_Good_Book.Nested = true;
                Dr_Good_Disc.Nested = true;

                Ds.Relations.Add(Dr_Good_Book);
                Ds.Relations.Add(Dr_Good_Disc);

                return Ds;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        #endregion
    }
}

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate x:Key="Book_Type_DataTemplate">
            <Grid Width="800" Height="20">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.771*"/>
                    <ColumnDefinition Width="0.229*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.5*"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Good_Type_Id}" Margin="0,0" Foreground="Black"></TextBlock>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Book_Type_Id}" Margin="100,0" Foreground="Black"></TextBlock>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Book_Type_Name}" Margin="200,0" Foreground="Black"></TextBlock>             
            </Grid>              
        </DataTemplate>

        <DataTemplate x:Key="Disc_Type_DataTemplate">
            <Grid Width="800" Height="20">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.771*"/>
                    <ColumnDefinition Width="0.229*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.5*"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Good_Type_Id}" Margin="0,0" Foreground="Black"></TextBlock>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Disc_Type_Id}" Margin="100,0" Foreground="Black"></TextBlock>
                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Disc_Type_Name}" Margin="200,0" Foreground="Black"></TextBlock>
            </Grid>
        </DataTemplate>


        <HierarchicalDataTemplate x:Key="Good_Book_DataTemplate" 
                      ItemsSource="{Binding Good_Book_Relation}" 
                      ItemTemplate="{StaticResource Book_Type_DataTemplate}">       
            <Grid Height="20">
                <TextBlock Text="{Binding Good_Type_Name}" Margin="10,0" HorizontalAlignment="Stretch" VerticalAlignment="Center"></TextBlock>    
                </Grid>     
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate x:Key="Good_Disc_DataTemplate" 
                      ItemsSource="{Binding Good_Disc_Relation}" 
                      ItemTemplate="{StaticResource Disc_Type_DataTemplate}">
            <Grid Height="20">
                <TextBlock Text="{Binding Good_Type_Name}" Margin="10,0" HorizontalAlignment="Stretch" VerticalAlignment="Center"></TextBlock>
            </Grid>
        </HierarchicalDataTemplate>


    </Window.Resources>
    <Grid>

        <TreeView x:Name="GoodTreeView" ItemsSource="{Binding Good_Type}" ItemTemplate="{DynamicResource Good_Book_DataTemplate}" 
                  HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">          
        </TreeView>


    </Grid>
</Window>
4

1 回答 1

1

我认为您将数据对象和视图对象耦合得太紧密了。看看MVVM模式。

目前,您有从数据访问调用返回的模型,并且您将视图直接绑定到它们上。你需要引入一些东西来在两层之间进行翻译。通过这种方式,您可以拥有DiscViewModels 和BookViewModels 并为每个拥有不同的数据模板。

你甚至可能想定义

class BookViewModel : BaseViewModel {}
class DiscViewModel : BaseViewModel {}

class BaseViewModel
{
  // All properties defined here
}

因为 WPF 类型引擎仍然会区分这两个类,即使它们是相同的。

于 2013-11-08T17:14:02.830 回答