diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs
index 91e087abc0..b5956d681a 100644
--- a/src/Avalonia.Base/AvaloniaObject.cs
+++ b/src/Avalonia.Base/AvaloniaObject.cs
@@ -54,7 +54,7 @@ namespace Avalonia
///
/// Delayed setter helper for direct properties. Used to fix #855.
///
- protected readonly DelayedSetter directDelayedSetter = new DelayedSetter();
+ private readonly DelayedSetter directDelayedSetter = new DelayedSetter();
///
@@ -589,6 +589,30 @@ namespace Avalonia
}
}
+ protected void SetAndRaise(AvaloniaProperty property, Action> setterCallback, T value, Action delayedSet)
+ {
+ Contract.Requires(setterCallback != null);
+ Contract.Requires(delayedSet != null);
+ if (!directDelayedSetter.IsNotifying(property))
+ {
+ setterCallback(value, notification =>
+ {
+ using (directDelayedSetter.MarkNotifying(property))
+ {
+ notification();
+ }
+ });
+ if (directDelayedSetter.HasPendingSet(property))
+ {
+ delayedSet((T)directDelayedSetter.GetFirstPendingSet(property));
+ }
+ }
+ else
+ {
+ directDelayedSetter.AddPendingSet(property, value);
+ }
+ }
+
///
/// Tries to cast a value to a type, taking into account that the value may be a
/// .
diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index e5f5e8fc30..294b14b13d 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -151,15 +151,18 @@ namespace Avalonia.Controls.Primitives
{
if (_updateCount == 0)
{
- var old = SelectedIndex;
- var effective = (value >= 0 && value < Items?.Cast