1. 语法
1.1. XAML
2. 备注
当前版本的TreeGrid仅可以使用甘特图控件指定数据源格式。如需支持其他类型数据源,需要重新实现AbstractExpander和AbstractTreeGridLayout。
2.1. 定义Expander样式
通过自定义AbstractExpander的集成类,并设置TreeGrid.ExpanderProvider,可实现Expander的自定义,从而更换逻辑或样式。
自定义类的实现可参考默认提供的Expander类:SimpleTaskExpander
TreeGrid是扩展Silverlight自身提供的DataGrid实现的,关键是自定义了新的Column类型,此Column在每一行的单元格中添加了一个按钮控件,根据任务的层级缩进,并在用户单击时,发起一个“展开/折叠”事件,事件EventArgs中包含行所对应的任务Item数据。
代码如下:
namespace V2TEK.Silverlight.Charts.TreeGridHelper
2: {
/// <summary>
/// 包含一个默认的Expander,继承自AbstractExpander。
/// 如有必要,可以通过继承AbstractExpander,复写Expander,并设置ExpanderProvider。
/// </summary>
class TreeGridExpanderColumn : DataGridTextColumn
8: {
public TreeGridExpanderColumn()
10: {
11: }
12:
private AbstractExpander CreateExpander()
14: {
as AbstractExpander;
16: }
17:
public Type ExpanderProvider
19: {
20: get;
21: set;
22: }
23:
object dataItem)
25: {
26: StackPanel panel = GeneratePanel(dataItem);
base.GenerateEditingElement(cell, dataItem));
return panel;
29: }
30:
object dataItem)
32: {
33: StackPanel panel = GeneratePanel(dataItem);
base.GenerateElement(cell, dataItem));
return panel;
36: }
37:
object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
39: {
as TextBox;
null)
42: {
string.Empty;
44: }
string text = ee.Text;
int length = text.Length;
as KeyEventArgs;
null) && (args.Key == Key.F2))
49: {
50: ee.Select(length, length);
return text;
52: }
53: ee.Select(0, length);
54:
base.PrepareCellForEdit(editingElement, editingEventArgs);
56: }
57:
public AbstractExpander GetExpander(DataGridRow row)
59: {
this.GetCellContent(row);
as AbstractExpander;
62: expander.Data = row.DataContext;
return expander;
64: }
65:
object dataItem)
67: {
new StackPanel();
69: panel.Orientation = Orientation.Horizontal;
70: panel.Children.Add(GenerateExpander(dataItem));
return panel;
72: }
73:
object dataItem)
75: {
76: AbstractExpander expander = CreateExpander();
77: expander.Data = dataItem;
new System.ComponentModel.PropertyChangedEventHandler(expander_PropertyChanged);
return expander;
80: }
81:
object sender, System.ComponentModel.PropertyChangedEventArgs e)
83: {
if (e.PropertyName == AbstractExpander.DATA_PROPERTY)
as AbstractExpander).Update();
86: }
87: }
88: }