@ -1,6 +1,7 @@
using System ;
using System ;
using System.Collections ;
using System.Collections ;
using System.Collections.Specialized ;
using System.Collections.Specialized ;
using System.ComponentModel ;
using System.Linq ;
using System.Linq ;
using Avalonia.Collections ;
using Avalonia.Collections ;
@ -16,6 +17,7 @@ namespace Avalonia.Controls.Utils
private IList ? _ items ;
private IList ? _ items ;
private bool _ updatingItems ;
private bool _ updatingItems ;
private bool _ updatingModel ;
private bool _ updatingModel ;
private bool _ initializeOnSourceAssignment ;
public SelectedItemsSync ( ISelectionModel model )
public SelectedItemsSync ( ISelectionModel model )
{
{
@ -63,10 +65,18 @@ namespace Avalonia.Controls.Utils
_ updatingModel = true ;
_ updatingModel = true ;
_ items = items ;
_ items = items ;
using ( Model . Update ( ) )
if ( Model . Source is object )
{
{
Model . ClearSelection ( ) ;
using ( Model . Update ( ) )
Add ( items ) ;
{
Model . ClearSelection ( ) ;
Add ( items ) ;
}
}
else if ( ! _ initializeOnSourceAssignment )
{
Model . PropertyChanged + = SelectionModelPropertyChanged ;
_ initializeOnSourceAssignment = true ;
}
}
if ( _ items is INotifyCollectionChanged incc2 )
if ( _ items is INotifyCollectionChanged incc2 )
@ -86,9 +96,11 @@ namespace Avalonia.Controls.Utils
if ( _ items ! = null )
if ( _ items ! = null )
{
{
Model . PropertyChanged - = SelectionModelPropertyChanged ;
Model . SelectionChanged - = SelectionModelSelectionChanged ;
Model . SelectionChanged - = SelectionModelSelectionChanged ;
Model = model ;
Model = model ;
Model . SelectionChanged + = SelectionModelSelectionChanged ;
Model . SelectionChanged + = SelectionModelSelectionChanged ;
_ initializeOnSourceAssignment = false ;
try
try
{
{
@ -175,6 +187,25 @@ namespace Avalonia.Controls.Utils
}
}
}
}
private void SelectionModelPropertyChanged ( object sender , PropertyChangedEventArgs e )
{
if ( _ initializeOnSourceAssignment & &
_ items ! = null & &
e . PropertyName = = nameof ( SelectionModel . Source ) )
{
try
{
_ updatingModel = true ;
Add ( _ items ) ;
_ initializeOnSourceAssignment = false ;
}
finally
{
_ updatingModel = false ;
}
}
}
private void SelectionModelSelectionChanged ( object sender , SelectionModelSelectionChangedEventArgs e )
private void SelectionModelSelectionChanged ( object sender , SelectionModelSelectionChangedEventArgs e )
{
{
if ( _ updatingModel )
if ( _ updatingModel )