Пример #1
0
        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);
        }
Пример #2
0
        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));
        }