private void OnChanged(RxListChange <object> changes) { lock (locker) { if (changeMode == DbChangeMode.Load) { return; } changeMode = DbChangeMode.Save; try { foreach (var added in changes.Added) { for (var i = ItemNodes.Count - 1; i >= added.Index; i--) { ItemNodes[i].Directory.MoveTo(Path.Combine(Directory.FullName, i.ToString())); } ItemNodes.Insert(added.Index, new DbObjectNode(Database, (IRxObject)added.Value, new DirectoryInfo(Path.Combine(Directory.FullName, added.Value.ToString())))); } } finally { changeMode = DbChangeMode.None; } } }
protected override void OnFileSystemChanged(FileSystemEventArgs args) { base.OnFileSystemChanged(args); lock (locker) { changeMode = DbChangeMode.Load; try { if (args.FullPath != Directory.FullName) { var relativePath = args.FullPath.Substring(Directory.FullName.Length).TrimStart(Path.DirectorySeparatorChar); var parts = relativePath.Split(Path.DirectorySeparatorChar); if (parts.Length == 1) { switch (args.ChangeType) { case WatcherChangeTypes.Created: int index; if (int.TryParse(relativePath, out index)) { if (index >= ItemNodes.Count || ItemNodes[index] == null) { var obj = (IRxObject)Activator.CreateInstance(MetaData.ElementType); var node = new DbObjectNode(Database, obj, new DirectoryInfo(Path.Combine(Directory.FullName, index.ToString()))); while (index > ItemNodes.Count) { ItemNodes.Add(null); } while (index > List.Count) { List.Add(null); } if (index < ItemNodes.Count) { ItemNodes[index] = node; } else { ItemNodes.Add(node); } if (index < List.Count) { List[index] = obj; } else { List.Add(obj); } } } break; } } } } finally { changeMode = DbChangeMode.None; } } }