示例#1
0
        public ExpressionNodeDataViewModel(ExpressionNodeData model, List <ExpressionNodeDataViewModel> allNodes, ICommand?openInNewWindow = null, RelayCommand?copyWatchExpression = null) : base(model)
        {
            if (model.EnableValueInNewWindow)
            {
                OpenInNewWindow = openInNewWindow;
            }
            CopyWatchExpression = copyWatchExpression;

            Children = model.Children.Select(x => {
                var vm = new ExpressionNodeDataViewModel(x, allNodes, openInNewWindow, CopyWatchExpression);
                allNodes.Add(vm);
                return(vm);
            }).ToList();
        }
        public VisualizerDataViewModel(VisualizerData model, ICommand?openInNewWindow = null, RelayCommand?copyWatchExpression = null) : base(model)
        {
            AllNodes = new List <ExpressionNodeDataViewModel>();
            Root     = new ExpressionNodeDataViewModel(model.Root, AllNodes, openInNewWindow, copyWatchExpression);

            var grouped =
                AllNodes
                .Where(x => x.Model.EndNodeType != null)
                .GroupBy(
                    x => x.Model.EndNodeType !.Value,
                    (endNodeType, grp) => (
                        endNodeType,
                        grp.GroupBy(
                            x => x.Model.EndNodeData,
                            (endNodeData, grp1) => new EndNodeGroupViewModel(endNodeData, grp1)
                            )
                        )
                    )
                .SelectMany(x => x.Item2.Select(y => (x.endNodeType, y)))
                .ToLookup(x => x.endNodeType, x => x.Item2);

            Constants  = grouped[Constant].ToList();
            Parameters = grouped[Parameter].ToList();
            ClosedVars = grouped[ClosedVar].ToList();
            Defaults   = grouped[Default].ToList();

            allGroups = grouped.SelectMany().ToList();

            UpdateSelection = new RelayCommand(sender => {
                if (inUpdateSelection)
                {
                    return;
                }

                inUpdateSelection = true;

                switch (sender)
                {
                case string s:
                    var selected = FindNodeBySpan(SourceSelectionStart, SourceSelectionLength);
                    Root.ClearSelection(selected);
                    break;

                case ExpressionNodeDataViewModel node:
                    Root.ClearSelection(node);
                    (SourceSelectionStart, SourceSelectionLength) = node.Model.Span;
                    break;

                case EndNodeGroupViewModel group:
                    allGroups.Where(x => x != group).ForEach(x => x.IsSelected = false);
                    Root.ClearSelection(group.Nodes.ToArray());
                    (SourceSelectionStart, SourceSelectionLength) = group.Nodes.First().Model.Span;
                    break;

                case null:
                    // previously selected group was unselected (presumably the only way for null to be passed in)
                    Root.ClearSelection();
                    break;

                default:
                    throw new InvalidOperationException("Selection update from unknown part of viewmodel");
                }
                inUpdateSelection = false;
            });
        }