Jelajahi Sumber

Use RecyclingElementFactory in ItemsRepeaterPage.

Steven Kirk 5 tahun lalu
induk
melakukan
4fbc43e785

+ 26 - 10
samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml

@@ -1,6 +1,30 @@
 <UserControl xmlns="https://github.com/avaloniaui"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              x:Class="ControlCatalog.Pages.ItemsRepeaterPage">
+  <UserControl.Resources>
+    <RecyclePool x:Key="RecyclePool" />
+    <DataTemplate x:Key="odd">
+      <TextBlock Background="Yellow"
+                 Foreground="Black"
+                 Height="{Binding Height}"
+                 Text="{Binding Text}"/>
+    </DataTemplate>
+    <DataTemplate x:Key="even">
+      <TextBlock Background="Wheat"
+                 Foreground="Black"
+                 Height="{Binding Height}"
+                 Text="{Binding Text}"/>
+    </DataTemplate>
+    <RecyclingElementFactory x:Key="elementFactory"
+                             RecyclePool="{StaticResource RecyclePool}"
+                             SelectTemplateKey="OnSelectTemplateKey">
+      <RecyclingElementFactory.Templates>
+        <StaticResource x:Key="odd" ResourceKey="odd" />
+        <StaticResource x:Key="even" ResourceKey="even" />
+      </RecyclingElementFactory.Templates>
+    </RecyclingElementFactory>
+  </UserControl.Resources>
+  
   <DockPanel>
     <StackPanel DockPanel.Dock="Top" Spacing="4" Margin="0 0 0 16">
       <TextBlock Classes="h1">ItemsRepeater</TextBlock>
@@ -23,16 +47,8 @@
       <ScrollViewer Name="scroller"
                     HorizontalScrollBarVisibility="Auto"
                     VerticalScrollBarVisibility="Auto">
-        <ItemsRepeater Name="repeater" Background="Transparent" Items="{Binding Items}">
-          <ItemsRepeater.ItemTemplate>
-            <DataTemplate>
-              <TextBlock Focusable="True"
-                         Background="{Binding Background}"
-                         Height="{Binding Height}"
-                         Text="{Binding Text}"/>
-            </DataTemplate>
-          </ItemsRepeater.ItemTemplate>
-        </ItemsRepeater>
+        <ItemsRepeater Name="repeater" Background="Transparent" Items="{Binding Items}"
+                       ItemTemplate="{StaticResource elementFactory}"/>
       </ScrollViewer>
     </Border>
   </DockPanel>

+ 6 - 0
samples/ControlCatalog/Pages/ItemsRepeaterPage.xaml.cs

@@ -38,6 +38,12 @@ namespace ControlCatalog.Pages
             AvaloniaXamlLoader.Load(this);
         }
 
+        public void OnSelectTemplateKey(object sender, SelectTemplateEventArgs e)
+        {
+            var item = (ItemsRepeaterPageViewModel.Item)e.DataContext;
+            e.TemplateKey = (item.Index % 2 == 0) ? "even" : "odd";
+        }
+
         private void LayoutChanged(object sender, SelectionChangedEventArgs e)
         {
             if (_repeater == null)

+ 3 - 9
samples/ControlCatalog/ViewModels/ItemsRepeaterPageViewModel.cs

@@ -55,20 +55,16 @@ namespace ControlCatalog.ViewModels
             return new ObservableCollection<Item>(
                 Enumerable.Range(1, 100000).Select(i => new Item(i)
                 {
-                    Text = $"Item {i.ToString()} {suffix}"
+                    Text = $"Item {i} {suffix}"
                 }));
         }
 
         public class Item : ReactiveObject
         {
             private double _height = double.NaN;
-            private int _index;
-
-            public Item(int index)
-            {
-                _index = index;
-            }
 
+            public Item(int index) => Index = index;
+            public int Index { get; }
             public string Text { get; set; }
             
             public double Height 
@@ -76,8 +72,6 @@ namespace ControlCatalog.ViewModels
                 get => _height;
                 set => this.RaiseAndSetIfChanged(ref _height, value);
             }
-
-            public IBrush Background => ((_index % 2) == 0) ? Brushes.Yellow : Brushes.Wheat;
         }
     }
 }