/// <summary>
        /// Performs the bubble action.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="action">The action.</param>
        /// <param name="e">The e.</param>
        public override void PerformBubbleAction <T>(GuiControlEventDelegate <T> action, T e)
        {
            if (this.FaceId.HasValue && this.DataSource.HasValue)
            {
                GuiFace face = Game.GuiManager.GetFace(this.FaceId.Value);

                DataIndex = 0;

                int x = X.GetValueOrDefault(0);
                int y = Y.GetValueOrDefault(0);

                foreach (var dataItem in this.DataSource.Value)
                {
                    DataItem = dataItem;

                    // Note that ChildOffsetX is usually a data bound and would be called with a different DataItem each time - exactly the way we want it.
                    int childOffsetX = ChildOffsetX.GetValueOrDefault(0);
                    int childOffsetY = ChildOffsetY.GetValueOrDefault(0);

                    if (e is MouseEventArgument)
                    {
                        (e as MouseEventArgument).X -= childOffsetX + x;
                        (e as MouseEventArgument).Y -= childOffsetY + y;
                    }

                    foreach (var control in Enumerable.Reverse(face.Controls))
                    {
                        control.Bubble(action, e);
                    }

                    if (e is MouseEventArgument)
                    {
                        (e as MouseEventArgument).X += childOffsetX + x;
                        (e as MouseEventArgument).Y += childOffsetY + y;
                    }

                    DataIndex++;
                }

                DataItem = null;
            }
        }
        /// <summary>
        /// Renders this control.
        /// </summary>
        /// <param name="offsetX">The X offset.</param>
        /// <param name="offsetY">The Y offset.</param>
        public override void RenderControl(int offsetX, int offsetY)
        {
            if (this.FaceId.HasValue && this.DataSource.HasValue)
            {
                GuiFace face = Game.GuiManager.GetFace(this.FaceId.Value);

                DataIndex = 0;

                foreach (var dataItem in this.DataSource.Value)
                {
                    DataItem = dataItem;

                    // Note that ChildOffsetX is usually a data bound and would be called with a different DataItem each time - exactly the way we want it.
                    face.Render(offsetX + X.GetValueOrDefault(0) + ChildOffsetX.GetValueOrDefault(0), offsetY + Y.GetValueOrDefault(0) + ChildOffsetY.GetValueOrDefault(0));

                    DataIndex++;
                }

                DataItem = null;
            }
        }