private void AddMetadataObjects(List <MetadataNodeViewModel> root, IMetadataService service)
        {
            InfoBase     metadata     = service.GetSystemInfoBase();
            MetadataNode metadataNode = new MetadataNode(metadata);

            metadataNode.Children = new List <MetadataNode>();
            MetadataNodeViewModel metadataVM = new MetadataNodeViewModel(null, metadataNode);

            metadataVM.Children = new ObservableCollection <MetadataNodeViewModel>();

            foreach (Namespace ns in metadata.Namespaces)
            {
                MetadataNode child = new MetadataNode(ns);
                child.Children = new List <MetadataNode>();
                metadataNode.Children.Add(child);
                MetadataNodeViewModel childVM = new MetadataNodeViewModel(metadataVM, child);
                childVM.Children = new ObservableCollection <MetadataNodeViewModel>();
                metadataVM.Children.Add(childVM);

                foreach (Entity entity in ns.Entities)
                {
                    MetadataNode grandchild = new MetadataNode(entity);
                    child.Children.Add(grandchild);
                    MetadataNodeViewModel grandchildVM = new MetadataNodeViewModel(childVM, grandchild);
                    childVM.Children.Add(grandchildVM);
                }
            }
            root.Add(metadataVM);
        }
        private void OnTypeSelected(object selectedType)
        {
            if (selectedType == null)
            {
                return;
            }
            MetadataNodeViewModel vm = selectedType as MetadataNodeViewModel;

            if (vm == null)
            {
                return;
            }
            MetadataNode model = vm.Model;

            if (model == null)
            {
                return;
            }
            Entity entity = model.Metadata as Entity;

            if (entity == null)
            {
                return;
            }

            this.Type  = entity;
            this.Value = null;

            this.SetupValueView();
            this.OnPropertyChanged("IsClearButtonVisible");
            this.OnPropertyChanged("IsReferenceObjectSelectionEnabled");
        }
        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            MetadataNodeViewModel viewModel = this.DataContext as MetadataNodeViewModel;

            if (viewModel == null)
            {
                return;
            }
            viewModel.SelectedNode = (MetadataNodeViewModel)e.NewValue;
        }
        protected override void InitializeViewModel()
        {
            IMetadataService metadata = new MetadataService();

            List <MetadataNodeViewModel> items = new List <MetadataNodeViewModel>();

            AddMetadataObjects(items, metadata);

            InfoBase system = new InfoBase();

            system.Name = "Primitive types";
            MetadataNode systemNode = new MetadataNode(system);

            systemNode.Children = new List <MetadataNode>();
            MetadataNodeViewModel systemVM = new MetadataNodeViewModel(null, systemNode);

            systemVM.Children = new ObservableCollection <MetadataNodeViewModel>();
            items.Add(systemVM);

            MetadataNode systemType = new MetadataNode(Entity.Int32);

            systemNode.Children.Add(systemType);
            systemVM.Children.Add(new MetadataNodeViewModel(systemVM, systemType));

            systemType = new MetadataNode(Entity.String);
            systemNode.Children.Add(systemType);
            systemVM.Children.Add(new MetadataNodeViewModel(systemVM, systemType));

            systemType = new MetadataNode(Entity.Decimal);
            systemNode.Children.Add(systemType);
            systemVM.Children.Add(new MetadataNodeViewModel(systemVM, systemType));

            systemType = new MetadataNode(Entity.Boolean);
            systemNode.Children.Add(systemType);
            systemVM.Children.Add(new MetadataNodeViewModel(systemVM, systemType));

            systemType = new MetadataNode(Entity.DateTime);
            systemNode.Children.Add(systemType);
            systemVM.Children.Add(new MetadataNodeViewModel(systemVM, systemType));

            foreach (InfoBase ib in metadata.GetInfoBases())
            {
                MetadataNode node = new MetadataNode(ib);
                node.Children = new List <MetadataNode>();
                MetadataNodeViewModel parentVM = new MetadataNodeViewModel(null, node);
                parentVM.Children = new ObservableCollection <MetadataNodeViewModel>();

                foreach (Namespace ns in ib.Namespaces)
                {
                    if (ns.Name == "Справочник" || ns.Name == "Документ")
                    {
                        MetadataNode child = new MetadataNode(ns);
                        child.Children = new List <MetadataNode>();
                        node.Children.Add(child);
                        MetadataNodeViewModel childVM = new MetadataNodeViewModel(parentVM, child);
                        childVM.Children = new ObservableCollection <MetadataNodeViewModel>();
                        parentVM.Children.Add(childVM);

                        foreach (Entity entity in ns.Entities)
                        {
                            MetadataNode grandchild = new MetadataNode(entity);
                            child.Children.Add(grandchild);
                            MetadataNodeViewModel grandchildVM = new MetadataNodeViewModel(childVM, grandchild);
                            childVM.Children.Add(grandchildVM);
                        }
                    }
                }

                items.Add(parentVM);
            }

            _ViewModel          = new MetadataNodeViewModel();
            _ViewModel.Children = new ObservableCollection <MetadataNodeViewModel>(items);
            this.View           = new MetadataNodeView(_ViewModel);
        }
        }                                  // used to create root node

        public MetadataNodeViewModel(MetadataNodeViewModel parent, MetadataNode model) : base()
        {
            this.Model  = model;
            this.Parent = parent;
        }
 public MetadataNodeView(MetadataNodeViewModel viewModel) : this()
 {
     this.DataContext = viewModel;
 }