|
|
|
@ -5,6 +5,7 @@ using System.Collections.Specialized; |
|
|
|
using System.Diagnostics.CodeAnalysis; |
|
|
|
using System.Linq; |
|
|
|
using Avalonia.Collections; |
|
|
|
using Avalonia.Data; |
|
|
|
|
|
|
|
namespace Avalonia.Controls.Selection |
|
|
|
{ |
|
|
|
@ -13,6 +14,7 @@ namespace Avalonia.Controls.Selection |
|
|
|
private IList? _writableSelectedItems; |
|
|
|
private int _ignoreModelChanges; |
|
|
|
private bool _ignoreSelectedItemsChanges; |
|
|
|
private bool _skipSyncFromSelectedItems; |
|
|
|
private bool _isResetting; |
|
|
|
|
|
|
|
public InternalSelectionModel() |
|
|
|
@ -60,6 +62,29 @@ namespace Avalonia.Controls.Selection |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
internal void Update(IEnumerable? source, Optional<IList?> selectedItems) |
|
|
|
{ |
|
|
|
var previousSource = Source; |
|
|
|
var previousWritableSelectedItems = _writableSelectedItems; |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
_skipSyncFromSelectedItems = true; |
|
|
|
SetSource(source); |
|
|
|
if (selectedItems.HasValue) |
|
|
|
WritableSelectedItems = selectedItems.Value; |
|
|
|
} |
|
|
|
finally |
|
|
|
{ |
|
|
|
_skipSyncFromSelectedItems = false; |
|
|
|
} |
|
|
|
|
|
|
|
// We skipped the sync from WritableSelectedItems before; do it now that both
|
|
|
|
// the source and WritableSelectedItems are updated.
|
|
|
|
if (previousSource != Source || previousWritableSelectedItems != _writableSelectedItems) |
|
|
|
SyncFromSelectedItems(); |
|
|
|
} |
|
|
|
|
|
|
|
private protected override void SetSource(IEnumerable? value) |
|
|
|
{ |
|
|
|
if (Source == value) |
|
|
|
@ -121,7 +146,7 @@ namespace Avalonia.Controls.Selection |
|
|
|
|
|
|
|
private void SyncFromSelectedItems() |
|
|
|
{ |
|
|
|
if (Source is null || _writableSelectedItems is null) |
|
|
|
if (_skipSyncFromSelectedItems || Source is null || _writableSelectedItems is null) |
|
|
|
{ |
|
|
|
return; |
|
|
|
} |
|
|
|
|