Exemplo n.º 1
0
        internal void HandleItemsChanged(NotifyCollectionChangedEventArgs e)
        {
            if (this.ItemsHost == null)
            {
                return;
            }

            IGeneratorHost host = (IGeneratorHost)this;

            if (e.Action == NotifyCollectionChangedAction.Reset)
            {
                this.Refresh();
            }
            else if (e.Action == NotifyCollectionChangedAction.Add)
            {
                object           item      = e.NewItems[0];
                DependencyObject container = host.GetContainerForItem(item, null);
                if (container != item)
                {
                    container.SetValue(FrameworkElement.DataContextProperty, item);
                }
                host.PrepareItemContainer(container, item);

                this.ItemContainerGenerator.INTERNAL_RegisterContainer(container, item);

                this.ItemsHost.Children.Insert(e.NewStartingIndex, (UIElement)container);
            }
            else if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                this.ItemContainerGenerator.INTERNAL_TryUnregisterContainer(
                    this.ItemsHost.Children[e.OldStartingIndex],
                    e.OldItems[0]);

                this.ItemsHost.Children.RemoveAt(e.OldStartingIndex);
            }
            else if (e.Action == NotifyCollectionChangedAction.Replace)
            {
                this.ItemContainerGenerator.INTERNAL_TryUnregisterContainer(
                    this.ItemsHost.Children[e.OldStartingIndex],
                    e.OldItems[0]);

                object           item      = e.NewItems[0];
                DependencyObject container = host.GetContainerForItem(item, null);
                if (container != item)
                {
                    container.SetValue(FrameworkElement.DataContextProperty, item);
                }
                host.PrepareItemContainer(container, item);

                this.ItemContainerGenerator.INTERNAL_RegisterContainer(container, item);

                this.ItemsHost.Children[e.OldStartingIndex] = (UIElement)container;
            }
            else
            {
                throw new NotSupportedException(string.Format("Unexpected collection change action '{0}'.", e.Action));
            }
        }
Exemplo n.º 2
0
        public FrameworkElement Generate(int index)
        {
            GeneratedItemContainer container = generatedContainers.FirstOrDefault(c => c.Index == index);

            if (container == null)
            {
                container = new GeneratedItemContainer(host.GetContainerForItem(host.View[index]), host.View[index], index);
                host.PrepareContainerForItem(container.Item, container.Container);
                generatedContainers.Add(container);
            }

            return(container.Container);
        }
Exemplo n.º 3
0
        internal void Refresh(bool reuseContainers)
        {
            IGeneratorHost host = this;

            DependencyObject[] oldContainers = new DependencyObject[Math.Max(this.ItemsHost.Children.Count, this.Items.CountInternal)];

            // First we need to get the containers and their associated item,
            // or they will be lost before being able to clear them.
            int containersCount = this.ItemsHost.Children.Count;

            object[] oldItems = new object[containersCount];
            for (int i = 0; i < containersCount; ++i)
            {
                DependencyObject container = this.ItemsHost.InternalChildren[i];
                oldContainers[i] = container;
                oldItems[i]      = this.ItemContainerGenerator.ItemFromContainer(container);
            }

            if (!reuseContainers)
            {
                this.ItemsHost.InternalChildren.Clear();
                this.ItemContainerGenerator.INTERNAL_Clear();

                for (int i = 0; i < containersCount; ++i)
                {
                    host.ClearContainerForItem(oldContainers[i], oldItems[i]);
                }
            }

            int count = this.Items.CountInternal;

            for (int i = 0; i < count; ++i)
            {
                object           item = this.Items[i];
                DependencyObject recycledContainer = reuseContainers ? oldContainers[i] : null;
                DependencyObject container         = host.GetContainerForItem(item, recycledContainer);

                if (!reuseContainers)
                {
                    this.ItemContainerGenerator.INTERNAL_RegisterContainer(container, item);
                    if (container != item)
                    {
                        container.SetValue(FrameworkElement.DataContextProperty, item);
                    }
                    this.ItemsHost.Children.Add((UIElement)container);
                }

                host.PrepareItemContainer(container, item);
            }
        }
Exemplo n.º 4
0
        private void OnItemAdded(object item, int position)
        {
            IGeneratorHost   host      = this;
            DependencyObject container = host.GetContainerForItem(item, null);

            this.ItemContainerGenerator.INTERNAL_RegisterContainer(container, item);
            if (container != item)
            {
                container.SetValue(DataContextProperty, item);
            }

            this.ItemsHost.Children.Insert(position, (UIElement)container);

            host.PrepareItemContainer(container, item);
        }
Exemplo n.º 5
0
        internal void Refresh()
        {
            IGeneratorHost host = (IGeneratorHost)this;

            this.ItemsHost.Children.Clear();
            this.ItemContainerGenerator.INTERNAL_Clear();
            foreach (var item in this.Items)
            {
                DependencyObject container = host.GetContainerForItem(item, null);
                if (container != item)
                {
                    container.SetValue(FrameworkElement.DataContextProperty, item);
                }
                host.PrepareItemContainer(container, item);

                this.ItemContainerGenerator.INTERNAL_RegisterContainer(container, item);

                this.ItemsHost.Children.Add((UIElement)container);
            }
        }