Пример #1
0
        protected virtual void RebuildPopertyNodesImpl()
        {
            DestroyPropertyNodes();

            object[] instances = Instances == null ? EmptyArray <object> .Instance
                                     : Instances.Cast <object>().ToArray();

            // TODO: cache and reuse PropertyNodes where possible to prevent having to
            // rebuild all of the data templates
            IEnumerable <PropertyDescriptor> descriptors = null;

            if (CustomPropertyDescriptors != null)
            {
                descriptors = CustomPropertyDescriptors;
            }
            else if (Instances != null)
            {
                descriptors = PropertyUtils.GetSharedPropertiesOriginal(instances);
            }

            PropertyNode headerPropertyNode = null;
            var          propertyNodes      = new ObservableCollection <PropertyNode>();

            if (descriptors != null)
            {
                var context = TransactionContext.As <ITransactionContext>();
                if (context == null)
                {
                    context = DataContext.As <ITransactionContext>();
                }

                foreach (var descriptor in descriptors)
                {
                    if (descriptor.IsBrowsable)
                    {
                        PropertyNode node;
                        if (PropertyFactory != null)
                        {
                            node = PropertyFactory.CreateProperty(instances, descriptor, true, context);
                        }
                        else
                        {
                            node = new PropertyNode();
                            node.Initialize(instances, descriptor, true);
                        }

                        node.ValueSet   += node_ValueSet;
                        node.ValueError += node_ValueError;

                        if (node.Category != null)
                        {
                            bool expansionState;
                            if (m_categoryExpanded.TryGetValue(node.Category, out expansionState))
                            {
                                node.IsExpanded = expansionState;
                            }
                        }

                        if (headerPropertyNode == null && descriptor.Attributes[typeof(HeaderPropertyAttribute)] != null)
                        {
                            headerPropertyNode = node;
                        }
                        else
                        {
                            propertyNodes.Add(node);
                        }
                    }
                }
            }

            // Listen for expansion state changes so that we can persist through different objects.
            m_listener = ChangeListener.Create(propertyNodes, "IsExpanded");
            m_listener.PropertyChanged += ChildExpandedPropertyChanged;

            Properties     = propertyNodes;
            HeaderProperty = headerPropertyNode;
        }