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)); } }
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); }
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); } }
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); }
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); } }