Skip to content

Commit c2fe015

Browse files
Transitioner: Short-circuit SelectionChanged event when not originating from Transitioner (#3619)
* Short-circuit SelectionChanged event when not originating from Transitioner * Add test for short circuit SelectionChanged event * Test for SelectionChanged fix --------- Co-authored-by: Michel Michels <[email protected]>
1 parent fbae122 commit c2fe015

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/MaterialDesignThemes.Wpf/Transitions/Transitioner.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public Transitioner()
6262
CommandBindings.Add(new CommandBinding(MoveFirstCommand, MoveFirstHandler));
6363
CommandBindings.Add(new CommandBinding(MoveLastCommand, MoveLastHandler));
6464
AddHandler(TransitionerSlide.InTransitionFinished, new RoutedEventHandler(IsTransitionFinishedHandler));
65+
AddHandler(SelectionChangedEvent, new RoutedEventHandler(SelectionChangedEventHandler));
6566
Loaded += (sender, args) =>
6667
{
6768
if (SelectedIndex != -1)
@@ -108,6 +109,15 @@ private void IsTransitionFinishedHandler(object sender, RoutedEventArgs routedEv
108109
}
109110
}
110111

112+
private static void SelectionChangedEventHandler(object sender, RoutedEventArgs e)
113+
{
114+
if (e.OriginalSource is not Transitioner)
115+
{
116+
// This event is bubbling up from a child Selector element. Swallow the event to avoid confusion with the SelectionChanged event on the Transitioner itself.
117+
e.Handled = true;
118+
}
119+
}
120+
111121
private void MoveNextHandler(object sender, ExecutedRoutedEventArgs executedRoutedEventArgs)
112122
{
113123
if (AutoApplyTransitionOrigins)

tests/MaterialDesignThemes.Wpf.Tests/TransitionerTests.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using MaterialDesignThemes.Wpf.Transitions;
2-
using Xunit;
32

43
namespace MaterialDesignThemes.Wpf.Tests;
54

@@ -52,4 +51,37 @@ public void WhenMovePrevious_ItCanRetreatMultipleSlides()
5251
//Assert
5352
Assert.Equal(0, transitioner.SelectedIndex);
5453
}
54+
55+
[StaFact]
56+
public void ShortCircuitIssue3268()
57+
{
58+
//Arrange
59+
Grid child1 = new();
60+
ListBox lb = new();
61+
lb.Items.Add(new Label());
62+
lb.Items.Add(new Label());
63+
child1.Children.Add(lb);
64+
65+
UserControl child2 = new();
66+
67+
Transitioner transitioner = new();
68+
transitioner.Items.Add(child1);
69+
transitioner.Items.Add(child2);
70+
71+
int selectionChangedCounter = 0;
72+
transitioner.SelectionChanged += (s, e) =>
73+
{
74+
selectionChangedCounter++;
75+
};
76+
Transitioner.MoveNextCommand.Execute(0, transitioner);
77+
78+
//Act
79+
Assert.NotNull(transitioner.SelectedItem);
80+
Assert.True(transitioner.SelectedItem == child1);
81+
lb.SelectedItem = lb.Items[1];
82+
83+
//Assert
84+
Assert.Equal(1, selectionChangedCounter);
85+
Assert.Equal(0, transitioner.SelectedIndex);
86+
}
5587
}

0 commit comments

Comments
 (0)