protected override void PartRemoved(string partName, object instance)
        {
            base.PartRemoved(partName, instance);

            if (instance == DataGroup)
            {
                DataGroup.RemoveEventListener(RendererExistenceEvent.RENDERER_ADD, DispatchEvent);
                DataGroup.RemoveEventListener(RendererExistenceEvent.RENDERER_REMOVE, DispatchEvent);

                // copy proxied values from DataGroup (if explicitly set) to DataGroupProperties

                var newDataGroupProperties = new DataGroupProperties();

                if (_dataGroupProperties.LayoutSet)
                {
                    newDataGroupProperties.Layout = DataGroup.Layout;
                }

                if (_dataGroupProperties.AutoLayoutSet)
                {
                    newDataGroupProperties.AutoLayout = DataGroup.AutoLayout;
                }

                if (_dataGroupProperties.DataProviderSet)
                {
                    newDataGroupProperties.DataProvider = DataGroup.DataProvider;
                }

                if (_dataGroupProperties.ItemRendererSet)
                {
                    newDataGroupProperties.ItemRenderer = DataGroup.ItemRenderer;
                }

                if (_dataGroupProperties.ItemRendererFunctionSet)
                {
                    newDataGroupProperties.ItemRendererFunction = DataGroup.ItemRendererFunction;
                }

                if (_dataGroupProperties.TypicalItemSet)
                {
                    newDataGroupProperties.TypicalItem = DataGroup.TypicalItem;
                }

                _dataGroupProperties = newDataGroupProperties;

                DataGroup.DataProvider           = null;
                DataGroup.Layout                 = null;
                DataGroup.RendererUpdateDelegate = null;
            }
        }
        protected override void PartRemoved(string partName, object instance)
        {
            base.PartRemoved(partName, instance);

            if (instance == DataGroup)
            {
                DataGroup.RemoveEventListener(RendererExistenceEvent.RENDERER_ADD, DispatchEvent);
                DataGroup.RemoveEventListener(RendererExistenceEvent.RENDERER_REMOVE, DispatchEvent);
                
                // copy proxied values from DataGroup (if explicitly set) to DataGroupProperties

                var newDataGroupProperties = new DataGroupProperties();

                if (_dataGroupProperties.LayoutSet)
                    newDataGroupProperties.Layout = DataGroup.Layout;

                if (_dataGroupProperties.AutoLayoutSet)
                    newDataGroupProperties.AutoLayout = DataGroup.AutoLayout;

                if (_dataGroupProperties.DataProviderSet)
                    newDataGroupProperties.DataProvider = DataGroup.DataProvider;

                if (_dataGroupProperties.ItemRendererSet)
                    newDataGroupProperties.ItemRenderer = DataGroup.ItemRenderer;

                if (_dataGroupProperties.ItemRendererFunctionSet)
                    newDataGroupProperties.ItemRendererFunction = DataGroup.ItemRendererFunction;

                if (_dataGroupProperties.TypicalItemSet)
                    newDataGroupProperties.TypicalItem = DataGroup.TypicalItem;
                
                _dataGroupProperties = newDataGroupProperties;
                
                DataGroup.DataProvider = null;
                DataGroup.Layout = null;
                DataGroup.RendererUpdateDelegate = null;
            }
        }
        protected override void PartAdded(string partName, object instance)
        {
            base.PartAdded(partName, instance);

            if (instance == DataGroup)
            {
                // copy proxied values from dataGroupProperties (if set) to dataGroup

                var newDataGroupProperties = new DataGroupProperties();

                if (null != _dataGroupProperties.Layout)
                {
                    DataGroup.Layout = _dataGroupProperties.Layout;
                    newDataGroupProperties.LayoutSet = true;
                }

                if (null != _dataGroupProperties.AutoLayout)
                {
                    DataGroup.AutoLayout = (bool)_dataGroupProperties.AutoLayout;
                    newDataGroupProperties.AutoLayoutSet = true;
                }

                if (null != _dataGroupProperties.DataProvider)
                {
                    //Debug.Log("_dataGroupProperties.DataProvider: " + _dataGroupProperties.DataProvider);
                    DataGroup.DataProvider = _dataGroupProperties.DataProvider;
                    newDataGroupProperties.DataProviderSet = true;
                }

                if (null != _dataGroupProperties.ItemRenderer)
                {
                    DataGroup.ItemRenderer = _dataGroupProperties.ItemRenderer;
                    newDataGroupProperties.ItemRendererSet = true;
                }

                if (null != _dataGroupProperties.ItemRendererFunction)
                {
                    DataGroup.ItemRendererFunction = _dataGroupProperties.ItemRendererFunction;
                    newDataGroupProperties.ItemRendererFunctionSet = true;
                }

                if (null != _dataGroupProperties.TypicalItem)
                {
                    DataGroup.TypicalItem = _dataGroupProperties.TypicalItem;
                    newDataGroupProperties.TypicalItemSet = true;
                }

                _dataGroupProperties = newDataGroupProperties;

                // Register our instance as the dataGroup's item renderer update delegate.
                DataGroup.RendererUpdateDelegate = this;

                // The only reason we have these listeners is to re-dispatch events.
                // We only add as necessary.

                if (HasEventListener(RendererExistenceEvent.RENDERER_ADD))
                {
                    DataGroup.AddEventListener(RendererExistenceEvent.RENDERER_ADD, DispatchEvent);
                }

                if (HasEventListener(RendererExistenceEvent.RENDERER_REMOVE))
                {
                    DataGroup.AddEventListener(RendererExistenceEvent.RENDERER_REMOVE, DispatchEvent);
                }
            }
        }
        protected override void PartAdded(string partName, object instance)
        {
            base.PartAdded(partName, instance);

            if (instance == DataGroup)
            {
                // copy proxied values from dataGroupProperties (if set) to dataGroup
                
                var newDataGroupProperties = new DataGroupProperties();
                
                if (null != _dataGroupProperties.Layout)
                {
                    DataGroup.Layout = _dataGroupProperties.Layout;
                    newDataGroupProperties.LayoutSet = true;
                }
                
                if (null != _dataGroupProperties.AutoLayout)
                {
                    DataGroup.AutoLayout = (bool) _dataGroupProperties.AutoLayout;
                    newDataGroupProperties.AutoLayoutSet = true;
                }
                
                if (null != _dataGroupProperties.DataProvider)
                {
                    //Debug.Log("_dataGroupProperties.DataProvider: " + _dataGroupProperties.DataProvider);
                    DataGroup.DataProvider = _dataGroupProperties.DataProvider;
                    newDataGroupProperties.DataProviderSet = true;
                }
                
                if (null != _dataGroupProperties.ItemRenderer)
                {
                    DataGroup.ItemRenderer = _dataGroupProperties.ItemRenderer;
                    newDataGroupProperties.ItemRendererSet = true;
                }
                
                if (null != _dataGroupProperties.ItemRendererFunction)
                {
                    DataGroup.ItemRendererFunction = _dataGroupProperties.ItemRendererFunction;
                    newDataGroupProperties.ItemRendererFunctionSet = true;
                }
                           
                if (null != _dataGroupProperties.TypicalItem)
                {
                    DataGroup.TypicalItem = _dataGroupProperties.TypicalItem;
                    newDataGroupProperties.TypicalItemSet = true;
                }

                _dataGroupProperties = newDataGroupProperties;
                
                // Register our instance as the dataGroup's item renderer update delegate.
                DataGroup.RendererUpdateDelegate = this;
                
                // The only reason we have these listeners is to re-dispatch events.  
                // We only add as necessary.
                
                if (HasEventListener(RendererExistenceEvent.RENDERER_ADD))
                {
                    DataGroup.AddEventListener(RendererExistenceEvent.RENDERER_ADD, DispatchEvent);
                }
                
                if (HasEventListener(RendererExistenceEvent.RENDERER_REMOVE))
                {
                    DataGroup.AddEventListener(RendererExistenceEvent.RENDERER_REMOVE, DispatchEvent);
                }
            }
        }