internal void RefreshUnboundItemProperty(object component)
        {
            if (m_unboundItems.Count <= 0 || (component == null))
            {
                return;
            }

            var unboundDataItem = UnboundDataItem.GetUnboundDataItem(component);

            if (unboundDataItem == null)
            {
                return;
            }

            var dataItem = unboundDataItem.DataItem;

            if ((dataItem == null) || (dataItem is EmptyDataItem))
            {
                return;
            }

            State state;

            if (m_dataItems.TryGetValue(dataItem, out state) && (state.Refreshing || state.Suspended))
            {
                return;
            }

            m_dataItems.Add(dataItem, new State(true, false));

            try
            {
                foreach (var item in m_unboundItems)
                {
                    item.Refresh(unboundDataItem);
                }
            }
            finally
            {
                state = m_dataItems[dataItem];

                if (state.Suspended)
                {
                    m_dataItems[dataItem] = new State(false, true);
                }
                else
                {
                    m_dataItems.Remove(dataItem);
                }
            }
        }
        internal void ResumeUnboundItemPropertyChanged(object component)
        {
            if (component == null)
            {
                return;
            }

            var unboundDataItem = UnboundDataItem.GetUnboundDataItem(component);

            if (unboundDataItem == null)
            {
                return;
            }

            var dataItem = unboundDataItem.DataItem;

            if ((dataItem == null) || (dataItem is EmptyDataItem))
            {
                return;
            }

            State state;

            if (!m_dataItems.TryGetValue(dataItem, out state) || !state.Suspended)
            {
                Debug.Fail("The item is not suspended.");
                return;
            }

            if (state.Refreshing)
            {
                m_dataItems[dataItem] = new State(true, false);
            }
            else
            {
                m_dataItems.Remove(dataItem);

                this.RefreshUnboundItemProperty(dataItem);
            }
        }
        internal void SuspendUnboundItemPropertyChanged(object component)
        {
            if (component == null)
            {
                return;
            }

            var unboundDataItem = UnboundDataItem.GetUnboundDataItem(component);

            if (unboundDataItem == null)
            {
                return;
            }

            var dataItem = unboundDataItem.DataItem;

            if ((dataItem == null) || (dataItem is EmptyDataItem))
            {
                return;
            }

            State state;
            bool  refreshing = false;

            if (m_dataItems.TryGetValue(dataItem, out state))
            {
                if (state.Suspended)
                {
                    return;
                }

                refreshing = state.Refreshing;
            }

            m_dataItems[dataItem] = new State(refreshing, true);
        }