Browse Source

Implement changing selection mode.

pull/4533/head
Steven Kirk 6 years ago
parent
commit
a078974eba
  1. 5
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 8
      src/Avalonia.Controls/Selection/SelectionModel.cs
  3. 26
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
  4. 48
      tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs

5
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -423,6 +423,11 @@ namespace Avalonia.Controls.Primitives
_selection.Clear();
}
}
else if (change.Property == SelectionModeProperty && _selection is object)
{
var newValue = change.NewValue.GetValueOrDefault<SelectionMode>();
_selection.SingleSelect = !newValue.HasFlagCustom(SelectionMode.Multiple);
}
}
/// <summary>

8
src/Avalonia.Controls/Selection/SelectionModel.cs

@ -45,6 +45,14 @@ namespace Avalonia.Controls.Selection
{
if (_singleSelect != value)
{
if (value == true)
{
using var update = BatchUpdate();
var selectedIndex = SelectedIndex;
Clear();
SelectedIndex = selectedIndex;
}
_singleSelect = value;
RangesEnabled = !value;

26
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -7,6 +7,7 @@ using System.Linq;
using Avalonia.Collections;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Selection;
using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input;
@ -1321,6 +1322,19 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(1, target.SelectedIndex);
}
[Fact]
public void Setting_SelectionMode_Should_Update_SelectionModel()
{
var target = new TestSelector();
var model = target.Selection;
Assert.True(model.SingleSelect);
target.SelectionMode = SelectionMode.Multiple;
Assert.False(model.SingleSelect);
}
private static void Prepare(SelectingItemsControl target)
{
var root = new TestRoot
@ -1401,6 +1415,18 @@ namespace Avalonia.Controls.UnitTests.Primitives
SelectionMode = selectionMode;
}
public new ISelectionModel Selection
{
get => base.Selection;
set => base.Selection = value;
}
public new SelectionMode SelectionMode
{
get => base.SelectionMode;
set => base.SelectionMode = value;
}
public new bool MoveSelection(NavigationDirection direction, bool wrap)
{
return base.MoveSelection(direction, wrap);

48
tests/Avalonia.Controls.UnitTests/Selection/SelectionModelTests_Multiple.cs

@ -712,6 +712,54 @@ namespace Avalonia.Controls.UnitTests.Selection
}
}
public class SingleSelect
{
[Fact]
public void Converting_To_Single_Selection_Removes_Multiple_Selection()
{
var target = CreateTarget();
var raised = 0;
target.SelectRange(1, 3);
target.SelectionChanged += (s, e) =>
{
Assert.Equal(new[] { 2, 3 }, e.DeselectedIndexes);
Assert.Equal(new[] { "baz", "qux" }, e.DeselectedItems);
Assert.Empty(e.SelectedIndexes);
Assert.Empty(e.SelectedItems);
++raised;
};
target.SingleSelect = true;
Assert.Equal(1, target.SelectedIndex);
Assert.Equal(new[] { 1 }, target.SelectedIndexes);
Assert.Equal("bar", target.SelectedItem);
Assert.Equal(new[] { "bar" }, target.SelectedItems);
Assert.Equal(1, raised);
}
[Fact]
public void Raises_PropertyChanged()
{
var target = CreateTarget();
var raised = 0;
target.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(target.SingleSelect))
{
++raised;
}
};
target.SingleSelect = true;
Assert.Equal(1, raised);
}
}
public class CollectionChanges
{
[Fact]

Loading…
Cancel
Save