/// <summary> /// Triggers the visual state changes and visual transitions /// to close the list out of selection mode. /// </summary> private void CloseSelection() { IList <WeakReference> items = ItemsControlExtensions.GetItemsInViewPort(this); //Only animate the containers in the view port. foreach (var i in items) { MultiselectItem item = (MultiselectItem)(((WeakReference)i).Target); item.State = SelectionEnabledState.Closed; item.UpdateVisualState(true); } Dispatcher.BeginInvoke(() => { for (int j = 0; j < this.Items.Count; j++) { MultiselectItem item = (MultiselectItem)ItemContainerGenerator.ContainerFromIndex(j); if (item != null) { item.State = SelectionEnabledState.Closed; item.UpdateVisualState(false); } } }); }
/// <summary> /// Sets the vertical alignment of the hint panels to stretch if the /// height is not manually set. If it is, the alignment is set to top. /// </summary> /// <param name="obj">The dependency object.</param> /// <param name="e">The event information.</param> private static void OnHintPanelHeightPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MultiselectItem source = (MultiselectItem)obj; if (source._outterHintPanel != null) { if (double.IsNaN((double)e.NewValue)) { source._outterHintPanel.VerticalAlignment = VerticalAlignment.Stretch; } else { source._outterHintPanel.VerticalAlignment = VerticalAlignment.Top; } } if (source._innerHintPanel != null) { if (double.IsNaN(source.HintPanelHeight)) { source._innerHintPanel.VerticalAlignment = VerticalAlignment.Stretch; } else { source._innerHintPanel.VerticalAlignment = VerticalAlignment.Top; } } }
/// <summary> /// ContentInfoTemplate changed handler. /// </summary> /// <param name="obj">The dependency object.</param> /// <param name="e">The event information.</param> private static void OnContentInfoTemplatePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MultiselectItem source = (MultiselectItem)obj; DataTemplate oldTemplate = e.OldValue as DataTemplate; DataTemplate newTemplate = e.NewValue as DataTemplate; source.OnContentInfoTemplateChanged(oldTemplate, newTemplate); }
/// <summary> /// Opens or closes the selection mode accordingly. /// If closing, it unselects any selected item. /// Finally, it fires up an IsSelectionEnabledChanged event. /// </summary> /// <param name="obj">The dependency object.</param> /// <param name="e">The event information.</param> private static void OnIsSelectionEnabledPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MultiselectList target = (MultiselectList)obj; if ((bool)e.NewValue) { target.OpenSelection(); } else { if (target.SelectedItems.Count > 0) { IList removedItems = new List <object>(); //All the selected items will be unselected. foreach (object item in target.SelectedItems) { removedItems.Add(item); } //Unselect the containers that are not virtualized. for (int k = 0; k < target.Items.Count && target.SelectedItems.Count > 0; k++) { MultiselectItem item = (MultiselectItem)target.ItemContainerGenerator.ContainerFromIndex(k); if (item != null) { if (item.IsSelected == true) { item._canTriggerSelectionChanged = false; item.IsSelected = false; item._canTriggerSelectionChanged = true; } } } //Clear the selected items and trigger event. target.SelectedItems.Clear(); target.OnSelectionChanged(removedItems, new object[0]); } target.CloseSelection(); } var handler = target.IsSelectionEnabledChanged; if (handler != null) { handler(obj, e); } }
/// <summary> /// Resets new or reused item containers appropiately. /// </summary> /// <param name="element"></param> /// <param name="item"></param> protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { base.PrepareContainerForItemOverride(element, item); MultiselectItem container = (MultiselectItem)element; container.Style = this.ItemContainerStyle; container._isBeingVirtualized = true; //Select or unselect item containers to put or clear checkmarks. container.IsSelected = SelectedItems.Contains(item); //Open or close item containers depending on the selection mode. container.State = IsSelectionEnabled ? SelectionEnabledState.Opened : SelectionEnabledState.Closed; container.UpdateVisualState(false); container._isBeingVirtualized = false; }
/// <summary> /// Adds or removes the item to the selected items collection /// in the Multiselect List that owns it. /// </summary> /// <param name="obj">The dependency object.</param> /// <param name="e">The event information.</param> private static void OnIsSelectedPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MultiselectItem item = (MultiselectItem)obj; RoutedEventArgs args = new RoutedEventArgs(); bool isSelected = (bool)e.NewValue; if (isSelected) { item.OnSelected(args); } else { item.OnUnselected(args); } //Ignore items being selected/unselected during parent virtualization. if (item._parent != null && !item._isBeingVirtualized) { if (isSelected) { item._parent.SelectedItems.Add(item.Content); //Trigger a selection changed event for one added item. if (item._canTriggerSelectionChanged) { item._parent.OnSelectionChanged(new object[0], new object[] { item.Content }); } } else { item._parent.SelectedItems.Remove(item.Content); //Trigger a selection changed event for one removed item. if (item._canTriggerSelectionChanged) { item._parent.OnSelectionChanged(new object[] { item.Content }, new object[0]); } } } }
/// <summary> /// ContentInfoProperty changed handler. /// </summary> /// <param name="obj">The dependency object.</param> /// <param name="e">The event information.</param> private static void OnContentInfoPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) { MultiselectItem source = (MultiselectItem)obj; source.OnContentInfoChanged(e.OldValue, e.NewValue); }