Browse Source

Added "Recreate" button to virtualization test app.

Steven Kirk 9 years ago
parent
commit
2ea322f54f

+ 1 - 0
samples/VirtualizationTest/MainWindow.xaml

@@ -17,6 +17,7 @@
             <TextBox Watermark="Viewport"
                      UseFloatingWatermark="True"
                      Text="{Binding #listBox.Scroll.Viewport, Mode=OneWay}"/>
+            <Button Command="{Binding RecreateCommand}">Recreate</Button>
         </StackPanel>
 
         <ListBox Name="listBox" Items="{Binding Items}">

+ 4 - 2
samples/VirtualizationTest/ViewModels/ItemViewModel.cs

@@ -8,13 +8,15 @@ namespace VirtualizationTest.ViewModels
 {
     internal class ItemViewModel : ReactiveObject
     {
+        private string _prefix;
         private int _index;
 
-        public ItemViewModel(int index)
+        public ItemViewModel(int index, string prefix = "Item")
         {
+            _prefix = prefix;
             _index = index;
         }
 
-        public string Header => $"Item {_index}";
+        public string Header => $"{_prefix} {_index}";
     }
 }

+ 31 - 2
samples/VirtualizationTest/ViewModels/MainWindowViewModel.cs

@@ -10,10 +10,14 @@ namespace VirtualizationTest.ViewModels
     internal class MainWindowViewModel : ReactiveObject
     {
         private int _itemCount = 200;
+        private IReactiveList<ItemViewModel> _items;
+        private string _prefix = "Item";
 
         public MainWindowViewModel()
         {
             this.WhenAnyValue(x => x.ItemCount).Subscribe(ResizeItems);
+            RecreateCommand = ReactiveCommand.Create();
+            RecreateCommand.Subscribe(_ => Recreate());
         }
 
         public int ItemCount
@@ -22,15 +26,40 @@ namespace VirtualizationTest.ViewModels
             set { this.RaiseAndSetIfChanged(ref _itemCount, value); }
         }
 
-        public IReactiveList<ItemViewModel> Items { get; private set; }
+        public IReactiveList<ItemViewModel> Items
+        {
+            get { return _items; }
+            private set { this.RaiseAndSetIfChanged(ref _items, value); }
+        }
+
+        public ReactiveCommand<object> RecreateCommand { get; private set; }
 
         private void ResizeItems(int count)
         {
             if (Items == null)
             {
-                var items = Enumerable.Range(0, count).Select(x => new ItemViewModel(x));
+                var items = Enumerable.Range(0, count)
+                    .Select(x => new ItemViewModel(x));
                 Items = new ReactiveList<ItemViewModel>(items);
             }
+            else if (count > Items.Count)
+            {
+                var items = Enumerable.Range(Items.Count, count - Items.Count)
+                    .Select(x => new ItemViewModel(x));
+                Items.AddRange(items);
+            }
+            else if (count < Items.Count)
+            {
+                Items.RemoveRange(count, Items.Count - count - 1);
+            }
+        }
+
+        private void Recreate()
+        {
+            _prefix = _prefix == "Item" ? "Recreated" : "Item";
+            var items = Enumerable.Range(0, _itemCount)
+                .Select(x => new ItemViewModel(x, _prefix));
+            Items = new ReactiveList<ItemViewModel>(items);
         }
     }
 }