Skip to content

CompareStateTrigger, EqualsStateTrigger and NotEqualStateTrigger can return unexpected results #37

@deepea

Description

@deepea

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions