在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();
}
}
输出:
希望这会有所帮助