Browse Source

Merge pull request #2970 from AvaloniaUI/fixes/2969-binding-selectitem-selecteditems

Fix binding both SelectedItem and SelectedItems.
pull/2979/head
danwalmsley 7 years ago
committed by GitHub
parent
commit
76c440934b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      src/Avalonia.Controls/ListBox.cs
  2. 10
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  3. 20
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

6
src/Avalonia.Controls/ListBox.cs

@ -66,7 +66,11 @@ namespace Avalonia.Controls
} }
/// <inheritdoc/> /// <inheritdoc/>
public new IList SelectedItems => base.SelectedItems; public new IList SelectedItems
{
get => base.SelectedItems;
set => base.SelectedItems = value;
}
/// <summary> /// <summary>
/// Gets or sets the selection mode. /// Gets or sets the selection mode.

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

@ -112,7 +112,7 @@ namespace Avalonia.Controls.Primitives
private bool _syncingSelectedItems; private bool _syncingSelectedItems;
private int _updateCount; private int _updateCount;
private int _updateSelectedIndex; private int _updateSelectedIndex;
private IList _updateSelectedItems; private object _updateSelectedItem;
/// <summary> /// <summary>
/// Initializes static members of the <see cref="SelectingItemsControl"/> class. /// Initializes static members of the <see cref="SelectingItemsControl"/> class.
@ -160,7 +160,7 @@ namespace Avalonia.Controls.Primitives
else else
{ {
_updateSelectedIndex = value; _updateSelectedIndex = value;
_updateSelectedItems = null; _updateSelectedItem = null;
} }
} }
} }
@ -183,7 +183,7 @@ namespace Avalonia.Controls.Primitives
} }
else else
{ {
_updateSelectedItems = new AvaloniaList<object>(value); _updateSelectedItem = value;
_updateSelectedIndex = int.MinValue; _updateSelectedIndex = int.MinValue;
} }
} }
@ -1075,9 +1075,9 @@ namespace Avalonia.Controls.Primitives
{ {
SelectedIndex = _updateSelectedIndex; SelectedIndex = _updateSelectedIndex;
} }
else if (_updateSelectedItems != null) else if (_updateSelectedItem != null)
{ {
SelectedItems = _updateSelectedItems; SelectedItem = _updateSelectedItem;
} }
} }

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

@ -921,6 +921,26 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.True(raised); Assert.True(raised);
} }
[Fact]
public void Can_Set_Both_SelectedItem_And_SelectedItems_During_Initialization()
{
// Issue #2969.
var target = new ListBox();
var selectedItems = new List<object>();
target.BeginInit();
target.Template = Template();
target.Items = new[] { "Foo", "Bar", "Baz" };
target.SelectedItems = selectedItems;
target.SelectedItem = "Bar";
target.EndInit();
Assert.Equal("Bar", target.SelectedItem);
Assert.Equal(1, target.SelectedIndex);
Assert.Same(selectedItems, target.SelectedItems);
Assert.Equal(new[] { "Bar" }, selectedItems);
}
private FuncControlTemplate Template() private FuncControlTemplate Template()
{ {
return new FuncControlTemplate<SelectingItemsControl>((control, scope) => return new FuncControlTemplate<SelectingItemsControl>((control, scope) =>

Loading…
Cancel
Save