在DataGrid中绑定层次结构数据的模板... [英] Template to bind a Hierarchical Data in a DataGrid...

查看:91
本文介绍了在DataGrid中绑定层次结构数据的模板...的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好

在我的申请中,我有一个雇员班级.每个Employee类都有以下属性:

In my application, I have a employee class. Each Employee class is having following properties:

  • 名称:字符串
  • ID:Int32
  • 名称:字符串
  • 下属(向此雇员报告的雇员集合):Employee []


我想在DataGridRow中显示Employee数据,其中提到的列为Name,ID,Designation.对于下属"属性,网格行应显示集合子雇员行.类似于名称"第一栏中的TreeView结构

I want to display, Employee data in a DataGridRow with columns mentioned as Name, ID, Designation. For Subordinates property the grid row should display collection child Employee rows. Something like a TreeView stucture in the first column of 'Name'

我如何使用模板来做到这一点?

How i can do this using templates?

谢谢

IamHuM

推荐答案

我已经实施了一个小样本.创建两个类 Employee ChildEmployee

I have Implemented a small sample. create two classes Employee and ChildEmployee

public class Employee : INotifyPropertyChanged
    {
        private string name;
        private int id;
        private string designation;
        private List<ChildEmployee> childEmployees;

        public event PropertyChangedEventHandler PropertyChanged;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
                OnPropertyChanged("Id");
            }
        }

        public string Designation
        {
            get
            {
                return designation;
            }
            set
            {
                designation = value;
                OnPropertyChanged("Designation");
            }
        }

        public List<ChildEmployee> ChildEmployees
        {
            get
            {
                return childEmployees;
            }
            set
            {
                childEmployees = value;
                OnPropertyChanged("ChildEmployees");
            }
        }

        public void OnPropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

    public class ChildEmployee : INotifyPropertyChanged
    {
        private string name;
        private int id;
        private string designation;
        public event PropertyChangedEventHandler PropertyChanged;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
                OnPropertyChanged("Id");
            }
        }

        public string Designation
        {
            get
            {
                return designation;
            }
            set
            {
                designation = value;
                OnPropertyChanged("Designation");
            }
        }

        public void OnPropertyChanged(string propertyName)
        {
            var handler = this.PropertyChanged;
            if (handler != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


主要事件:创建数据对象

var employeesList = new List<Employee>()
           {
           new Employee
           {
               Name="John",
               Id=1,
               Designation="Project Manager", 
               ChildEmployees = new List<ChildEmployee>{
                                                        new ChildEmployee{Name="William",Designation="Senior Developer",Id=2},
                                                        new ChildEmployee{Name="James",Designation="Junior Developer",Id=3},
                                                        new ChildEmployee{Name="Roy",Designation="Test Engineer",Id=4},
                                                       }
           },

           new Employee
           {
               Name="Tim",
               Id=11,
               Designation="Delivery Manager", 
               ChildEmployees = new List<ChildEmployee>{
                                                        new ChildEmployee{Name="Cook",Designation="Lead Engineer",Id=5},
                                                        new ChildEmployee{Name="Robert",Designation="Junior Developer",Id=6},
                                                        new ChildEmployee{Name="Nancy",Designation="Test Engineer",Id=7},
                                                       }
           },

           new Employee
           {
               Name="Joseph",
               Id=12,
               Designation="Project Manager", 
               ChildEmployees = new List<ChildEmployee>{
                                                        new ChildEmployee{Name="William",Designation="Senior Developer",Id=8},
                                                        new ChildEmployee{Name="James",Designation="Junior Developer",Id=9},
                                                        new ChildEmployee{Name="Roy",Designation="Test Engineer",Id=10},
                                                       }
           },

           new Employee
           {
               Name="John",
               Id=1,
               Designation="Project Manager", 
               ChildEmployees = new List<ChildEmployee>{
                                                        new ChildEmployee{Name="William",Designation="Senior Developer",Id=2},
                                                        new ChildEmployee{Name="James",Designation="Junior Developer",Id=3},
                                                        new ChildEmployee{Name="Roy",Designation="Test Engineer",Id=4},
                                                       }
           },

           new Employee
           {
               Name="John",
               Id=1,
               Designation="Project Manager", 
               ChildEmployees = new List<ChildEmployee>{
                                                        new ChildEmployee{Name="William",Designation="Senior Developer",Id=2},
                                                        new ChildEmployee{Name="James",Designation="Junior Developer",Id=3},
                                                        new ChildEmployee{Name="Roy",Designation="Test Engineer",Id=4},
                                                       }
           }
           };

            dgGrid.ItemsSource = employeesList;
        }


用于DataGrid的XAML:

 <DataGrid x:Name="dgGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Id">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Id}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Name">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Designation">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Designation}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

                <DataGridTemplateColumn Header="Child Employees">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid Height="200">
                                <TreeView Name="trvFamilies" ItemsSource="{Binding Converter={StaticResource ItemsSourceConverter}}">
                                    <TreeView.Resources>
                                        <HierarchicalDataTemplate DataType="{x:Type self:Employee}" ItemsSource="{Binding ChildEmployees}">
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}" />
                                                <TextBlock Text=" [" Foreground="Blue" />
                                                <TextBlock Text="{Binding Designation}" Foreground="Blue" />
                                                <TextBlock Text="]" Foreground="Blue" />
                                            </StackPanel>
                                        </HierarchicalDataTemplate>
                                        <DataTemplate DataType="{x:Type self:ChildEmployee}">
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}" />
                                                <TextBlock Text=" (" Foreground="Green" />
                                                <TextBlock Text="{Binding Designation}" Foreground="Green" />
                                                <TextBlock Text=" )" Foreground="Green" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </TreeView.Resources>
                                </TreeView>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>


使用了名为 ItemsSourceConverter 的转换器将单个员工对象转换为集合

used a converter named ItemsSourceConverter to Convert a Single employee object to a collection

ItemsSourceConverter.cs

public class ItemsSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var employee = value as Employee;
            return new List<Employee> { employee };
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

输出:

希望这会有所帮助


这篇关于在DataGrid中绑定层次结构数据的模板...的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆