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>
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
EqualsStateTrigger.cs
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