protected MindMapViewModel(IPersistence persistence = null) { this.Log().Debug("Creating {0}", this.GetType().Name); ViewModel = this; _persistence = persistence ?? Locator.Current.GetService <IPersistence>(); LeftTreeItems = AllTreeItems.CreateDerivedCollection(x => x, x => x.Index > (AllTreeItems.Count / 2) - 1); RightTreeItems = AllTreeItems.CreateDerivedCollection(x => x, x => x.Index <= (AllTreeItems.Count / 2) - 1); var settingSelectedItem = false; this.WhenAnyValue(x => x.LeftSelection).Subscribe(x => { if (settingSelectedItem) { return; } settingSelectedItem = true; if (RightSelection != null) { RightSelection.IsSelected = false; } SelectedItem = x; settingSelectedItem = false; }); this.WhenAnyValue(x => x.RightSelection).Subscribe(x => { if (settingSelectedItem) { return; } settingSelectedItem = true; if (LeftSelection != null) { LeftSelection.IsSelected = false; } SelectedItem = x; settingSelectedItem = false; }); var falseWhenNothingSelected = this.WhenAnyValue(x => x.SelectedItem).Where(x => x == null).Select(x => false); this.WhenAnyValue(x => x.SelectedItem.CanMoveUp).Merge(falseWhenNothingSelected) .Log(this, "canMoveUp ") .ToProperty(this, x => x.CanMoveUp, out _canMoveUp); this.WhenAnyValue(x => x.SelectedItem.CanMoveDown).Merge(falseWhenNothingSelected) .Log(this, "canMoveDown ") .ToProperty(this, x => x.CanMoveDown, out _canMoveDown); this.WhenAnyValue(x => x.SelectedItem.CanPromote).Merge(falseWhenNothingSelected) .Log(this, "canPromote ") .ToProperty(this, x => x.CanPromote, out _canPromote); this.WhenAnyValue(x => x.SelectedItem.CanDemote).Merge(falseWhenNothingSelected) .Log(this, "canDemote ") .ToProperty(this, x => x.CanDemote, out _canDemote); this.WhenAnyValue(x => x.SelectedItem.CanViewPage).Merge(falseWhenNothingSelected) .Log(this, "canViewPage") .ToProperty(this, x => x.CanViewPage, out _canViewPage); }
public void Push(Item root) { AllExternalDataItems = initialDataItems.ToList(); MatchedExternalDataItems.Clear(); UnmatchedExternalDataItems = initialDataItems.ToList(); AllTreeItems.AddRange(root.Subtree().OfType <TItem>()); MatchedTreeItems.Clear(); UnmatchedTreeItems = AllTreeItems.ToList(); match = new Dictionary <TItem, TData>(); matrix = new double[AllTreeItems.Count, AllExternalDataItems.Count]; for (int i = 0; i < AllTreeItems.Count; i++) { for (int j = 0; j < AllExternalDataItems.Count; j++) { matrix[i, j] = distance(AllTreeItems[i], AllExternalDataItems[j]); } } for (int i = 0; i < AllTreeItems.Count; i++) { var storedData = AllTreeItems[i].Get <TData>(); if (storedData != null) { var foundData = UnmatchedExternalDataItems.Where(z => Equals(z, storedData)).FirstOrDefault(); if (foundData != null) { MakeMatch(i, AllExternalDataItems.IndexOf(foundData)); } } } while (true) { int bestX = -1; int bestY = -1; double best = 0; for (int i = 0; i < AllTreeItems.Count; i++) { for (int j = 0; j < AllExternalDataItems.Count; j++) { if (bestX < 0 || matrix[i, j] > best) { bestX = i; bestY = j; best = matrix[i, j]; } } } if (best > 0) { MakeMatch(bestX, bestY); } else { break; } } DataBinding <TItem> .Pull(root, z => match.ContainsKey(z)?match[z] : default(TData)); }