forked from grijjy/MvvmStarterKit
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathModel.Node.pas
More file actions
129 lines (106 loc) · 2.37 KB
/
Copy pathModel.Node.pas
File metadata and controls
129 lines (106 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit Model.Node;
interface
uses
System.SysUtils,
System.UITypes,
System.Generics.Collections,
Grijjy.Mvvm.Observable
;
type
TNodes = class; //forward declaration
{ A model that represents a Treenode }
TNode = class(TgoObservable)
{$REGION 'Internal Declarations'}
private
FID: Int64;
FBez: String;
FParent: TNode;
fChildren: TNodes;
{$ENDREGION 'Internal Declarations'}
public
constructor Create;
destructor Destroy; override;
procedure Assign(const ASource: TNode);
procedure SetBez( ABez: string);
procedure SetParent( AParent: TNode);
function GetChildren: TNodes;
procedure SetChildren( const ANodes: TNodes);
{ Bindable properties }
property ID: Int64 read FID write FID;
property Bez: String read FBez write FBez;
property Parent: TNode read FParent write SetParent;
property Children: TNodes read GetChildren write SetChildren;
end;
TNodes = class(TgoObservableCollection<TNode>)
public
constructor Create;
destructor Destroy; overload;
procedure Assign(const ASource: TEnumerable<TNode>);
end;
implementation
uses
Grijjy.Mvvm.Types;
{ TNode }
procedure TNode.Assign(const ASource: TNode);
begin
Assert(Assigned(ASource));
{ Important: do not assign to fields. Assign to properties instead, so it
will fire PropertyChanged notifications. }
Bez := ASource.FBez;
Parent := ASource.Parent;
Children.Assign(ASource.FChildren);
end;
constructor TNode.Create;
begin
inherited;
FChildren := TNodes.Create;
end;
destructor TNode.Destroy;
begin
Children.Free;
inherited;
end;
procedure TNode.SetBez(ABez: string);
begin
FBez := ABez;
PropertyChanged('Bez');
end;
procedure TNode.SetParent(AParent: TNode);
begin
FParent := AParent;
PropertyChanged('Parent');
end;
function TNode.GetChildren: TNodes;
begin
Result := FChildren;
end;
procedure TNode.SetChildren( const ANodes: TNodes);
begin
if Assigned(ANodes) then
begin
FChildren.Assign(ANodes);
PropertyChanged('ChildCount');
end;
end;
{ TNodes }
procedure TNodes.Assign(const ASource: TEnumerable<TNode>);
var
SrcNode, DstNode: TNode;
begin
Clear;
for SrcNode in ASource do
begin
DstNode := TNode.Create;
DstNode.Assign(SrcNode);
Add(DstNode);
end;
end;
constructor TNodes.Create;
begin
inherited Create(True);
end;
destructor TNodes.Destroy;
begin
inherited;
end;
end.