-
-
Notifications
You must be signed in to change notification settings - Fork 58
Open
Description
CompareStateTrigger, EqualsStateTrigger and NotEqualStateTrigger, since it uses EqualsStateTrigger internally, can return unexpected results because they use == for comparison rather than object.Equals(…). The result is a reference comparison when that was probably not intended.
Fixes:
Change comparisons from using == to object.Equals(…).
CompareStateTrigger.cs
internal Comparison CompareValues()
{
…
//if (v1 == v2) OLD METHOD
if (object.Equals(v1, v2)) // NEW METHOD
{
if (Comparison == Comparison.Equal)
return Comparison.Equal;
}
…
}EqualsStateTrigger.cs
internal static bool AreValuesEqual(object value1, object value2, bool convertType)
{
//if (value1 == value2) OLD METHOD
if (object.Equals(value1, value2)) // NEW METHOD
{
return true;
}
…
}To Reproduce:
The provided example shows the issue with the EqualsStateTrigger, using boolean values. CompareStateTrigger seems to do better in this particular case because it uses IComparable when possible. However, CompareStateTrigger has given me similar issues using enums. I can provide an example of the latter as proof if necessary.
MainPage.xaml
<Page
x:Class="TestComparisons.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestComparisons"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wst="using:WindowsStateTriggers"
mc:Ignorable="d">
<Page.Resources>
<x:Boolean x:Key="TrueValue">True</x:Boolean>
<x:Boolean x:Key="AnotherTrueValue">True</x:Boolean>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState>
<VisualState.StateTriggers>
<wst:EqualsStateTrigger Value="{StaticResource TrueValue}" EqualTo="{StaticResource AnotherTrueValue}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="comparisonStatus.Text" Value="The values match, as expected" />
</VisualState.Setters>
</VisualState>
<VisualState>
<VisualState.StateTriggers>
<wst:NotEqualStateTrigger Value="{StaticResource TrueValue}" NotEqualTo="{StaticResource AnotherTrueValue}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="comparisonStatus.Text" Value="The values do not match! Unexpected." />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="comparisonStatus" Margin="3" />
</Grid>
</Page>Metadata
Metadata
Assignees
Labels
No labels