Browse Source

Tweak raising SelectedIndex/Item property changed.

pull/4659/head
Steven Kirk 6 years ago
parent
commit
5ac25a26f4
  1. 2
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 42
      src/Avalonia.Controls/Selection/SelectionModel.cs

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

@ -613,7 +613,7 @@ namespace Avalonia.Controls.Primitives
RaisePropertyChanged(SelectedIndexProperty, _oldSelectedIndex, SelectedIndex); RaisePropertyChanged(SelectedIndexProperty, _oldSelectedIndex, SelectedIndex);
_oldSelectedIndex = SelectedIndex; _oldSelectedIndex = SelectedIndex;
} }
else if (e.PropertyName == nameof(ISelectionModel.SelectedItem)) else if (e.PropertyName == nameof(ISelectionModel.SelectedItem) && _oldSelectedItem != SelectedItem)
{ {
RaisePropertyChanged(SelectedItemProperty, _oldSelectedItem, SelectedItem); RaisePropertyChanged(SelectedItemProperty, _oldSelectedItem, SelectedItem);
_oldSelectedItem = SelectedItem; _oldSelectedItem = SelectedItem;

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

@ -345,7 +345,9 @@ namespace Avalonia.Controls.Selection
LostSelection(this, EventArgs.Empty); LostSelection(this, EventArgs.Empty);
} }
CommitOperation(update.Operation); // Don't raise PropertyChanged events here as the OnSourceCollectionChanged event that
// let to this method being called will raise them if necessary.
CommitOperation(update.Operation, raisePropertyChanged: false);
} }
private protected override CollectionChangeState OnItemsAdded(int index, IList items) private protected override CollectionChangeState OnItemsAdded(int index, IList items)
@ -430,6 +432,11 @@ namespace Avalonia.Controls.Selection
RaisePropertyChanged(nameof(SelectedIndex)); RaisePropertyChanged(nameof(SelectedIndex));
} }
if (e.Action == NotifyCollectionChangedAction.Remove && e.OldStartingIndex <= oldSelectedIndex)
{
RaisePropertyChanged(nameof(SelectedItem));
}
if (oldAnchorIndex != _anchorIndex) if (oldAnchorIndex != _anchorIndex)
{ {
RaisePropertyChanged(nameof(AnchorIndex)); RaisePropertyChanged(nameof(AnchorIndex));
@ -611,7 +618,7 @@ namespace Avalonia.Controls.Selection
} }
} }
private void CommitOperation(Operation operation) private void CommitOperation(Operation operation, bool raisePropertyChanged = true)
{ {
try try
{ {
@ -679,23 +686,26 @@ namespace Avalonia.Controls.Selection
} }
} }
if (oldSelectedIndex != _selectedIndex) if (raisePropertyChanged)
{ {
indexesChanged = true; if (oldSelectedIndex != _selectedIndex)
RaisePropertyChanged(nameof(SelectedIndex)); {
RaisePropertyChanged(nameof(SelectedItem)); indexesChanged = true;
} RaisePropertyChanged(nameof(SelectedIndex));
RaisePropertyChanged(nameof(SelectedItem));
}
if (oldAnchorIndex != _anchorIndex) if (oldAnchorIndex != _anchorIndex)
{ {
indexesChanged = true; indexesChanged = true;
RaisePropertyChanged(nameof(AnchorIndex)); RaisePropertyChanged(nameof(AnchorIndex));
} }
if (indexesChanged) if (indexesChanged)
{ {
RaisePropertyChanged(nameof(SelectedIndexes)); RaisePropertyChanged(nameof(SelectedIndexes));
RaisePropertyChanged(nameof(SelectedItems)); RaisePropertyChanged(nameof(SelectedItems));
}
} }
} }
finally finally

Loading…
Cancel
Save