Browse Source

Handle move and replace in virtualized lists.

pull/558/head
Steven Kirk 10 years ago
parent
commit
6e73244a1e
  1. 5
      src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
  2. 45
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

5
src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs

@ -104,6 +104,11 @@ namespace Avalonia.Controls.Presenters
break;
case NotifyCollectionChangedAction.Move:
case NotifyCollectionChangedAction.Replace:
RecycleContainers();
break;
case NotifyCollectionChangedAction.Reset:
RecycleContainersOnRemove();
break;

45
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs

@ -303,6 +303,51 @@ namespace Avalonia.Controls.UnitTests.Presenters
Assert.Equal(expected, actual);
}
[Fact]
public void Replacing_Items_Should_Update_Containers()
{
var target = CreateTarget(itemCount: 20);
target.ApplyTemplate();
target.Measure(new Size(100, 100));
target.Arrange(new Rect(0, 0, 100, 100));
var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList();
var items = (ObservableCollection<string>)target.Items;
var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
Assert.Equal(expected, actual);
items[4] = expected[4] = "Replaced";
actual = target.Panel.Children.Select(x => x.DataContext).ToList();
Assert.Equal(expected, actual);
}
[Fact]
public void Moving_Items_Should_Update_Containers()
{
var target = CreateTarget(itemCount: 20);
target.ApplyTemplate();
target.Measure(new Size(100, 100));
target.Arrange(new Rect(0, 0, 100, 100));
var expected = Enumerable.Range(0, 10).Select(x => $"Item {x}").ToList();
var items = (ObservableCollection<string>)target.Items;
var actual = target.Panel.Children.Select(x => x.DataContext).ToList();
Assert.Equal(expected, actual);
items.Move(4, 8);
var i = expected[4];
expected.RemoveAt(4);
expected.Insert(8, i);
actual = target.Panel.Children.Select(x => x.DataContext).ToList();
Assert.Equal(expected, actual);
}
[Fact]
public void Setting_Items_To_Null_Should_Remove_Containers()
{

Loading…
Cancel
Save