Browse Source

let dropdown support virtualization if needed

Andrey Kunchev 7 years ago
parent
commit
59a286ba10
2 changed files with 28 additions and 2 deletions
  1. 24 1
      src/Avalonia.Controls/DropDown.cs
  2. 4 1
      src/Avalonia.Themes.Default/DropDown.xaml

+ 24 - 1
src/Avalonia.Controls/DropDown.cs

@@ -4,8 +4,10 @@
 using System;
 using System.Linq;
 using Avalonia.Controls.Generators;
+using Avalonia.Controls.Presenters;
 using Avalonia.Controls.Primitives;
 using Avalonia.Controls.Shapes;
+using Avalonia.Controls.Templates;
 using Avalonia.Input;
 using Avalonia.LogicalTree;
 using Avalonia.Media;
@@ -13,12 +15,17 @@ using Avalonia.VisualTree;
 
 namespace Avalonia.Controls
 {
-
     /// <summary>
     /// A drop-down list control.
     /// </summary>
     public class DropDown : SelectingItemsControl
     {
+        /// <summary>
+        /// The default value for the <see cref="ItemsControl.ItemsPanel"/> property.
+        /// </summary>
+        private static readonly FuncTemplate<IPanel> DefaultPanel =
+            new FuncTemplate<IPanel>(() => new VirtualizingStackPanel());
+
         /// <summary>
         /// Defines the <see cref="IsDropDownOpen"/> property.
         /// </summary>
@@ -40,6 +47,12 @@ namespace Avalonia.Controls
         public static readonly DirectProperty<DropDown, object> SelectionBoxItemProperty =
             AvaloniaProperty.RegisterDirect<DropDown, object>(nameof(SelectionBoxItem), o => o.SelectionBoxItem);
 
+        /// <summary>
+        /// Defines the <see cref="VirtualizationMode"/> property.
+        /// </summary>
+        public static readonly StyledProperty<ItemVirtualizationMode> VirtualizationModeProperty =
+            ItemsPresenter.VirtualizationModeProperty.AddOwner<DropDown>();
+
         private bool _isDropDownOpen;
         private Popup _popup;
         private object _selectionBoxItem;
@@ -49,6 +62,7 @@ namespace Avalonia.Controls
         /// </summary>
         static DropDown()
         {
+            ItemsPanelProperty.OverrideDefaultValue<DropDown>(DefaultPanel);
             FocusableProperty.OverrideDefaultValue<DropDown>(true);
             SelectedItemProperty.Changed.AddClassHandler<DropDown>(x => x.SelectedItemChanged);
             KeyDownEvent.AddClassHandler<DropDown>(x => x.OnKeyDown, Interactivity.RoutingStrategies.Tunnel);
@@ -81,6 +95,15 @@ namespace Avalonia.Controls
             set { SetAndRaise(SelectionBoxItemProperty, ref _selectionBoxItem, value); }
         }
 
+        /// <summary>
+        /// Gets or sets the virtualization mode for the items.
+        /// </summary>
+        public ItemVirtualizationMode VirtualizationMode
+        {
+            get { return GetValue(VirtualizationModeProperty); }
+            set { SetValue(VirtualizationModeProperty, value); }
+        }
+
         /// <inheritdoc/>
         protected override IItemContainerGenerator CreateItemContainerGenerator()
         {

+ 4 - 1
src/Avalonia.Themes.Default/DropDown.xaml

@@ -42,8 +42,11 @@
                 <ScrollViewer>
                   <ItemsPresenter Name="PART_ItemsPresenter"
                                   Items="{TemplateBinding Items}"
+                                  ItemsPanel="{TemplateBinding ItemsPanel}"
                                   ItemTemplate="{TemplateBinding ItemTemplate}"
-                                  MemberSelector="{TemplateBinding MemberSelector}"/>
+                                  MemberSelector="{TemplateBinding MemberSelector}"
+                                  VirtualizationMode="{TemplateBinding VirtualizationMode}"
+                                  />
                 </ScrollViewer>
               </Border>
             </Popup>