web-dev-qa-db-fra.com

datatrigger sur enum pour changer d'image

J'ai un bouton avec une image d'arrière-plan fixe et j'aimerais afficher une petite image superposée dessus. L'image de superposition à choisir dépend d'une propriété de dépendance (LapCounterPingStatus) du modèle de vue correspondant.

C'est ce que j'ai eu jusqu'à présent:

<Button>
    <Grid>
        <Image Stretch="None"> <!-- Background Image -->
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Setter Property="Source" Value="/Images/Pingn.png"/>
                </Style>
            </Image.Style>
        </Image>
        <Image Stretch="None" Panel.ZIndex="1"> <!-- Small Overlay Image -->
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_UNKNOWN">
                            <Setter Property="Source" Value="/Images/RefreshOverlayn.png"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_FAILURE">
                            <Setter Property="Source" Value="/Images/ErrorOverlayn.png"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_SUCCESS">
                            <Setter Property="Source" Value="/Images/CheckmarkOverlayn.png"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    </Grid>
</Button>

Parties pertinentes de mon modèle de vue

public class ConfigurationViewModel
{
   public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };

   public PingStatus LapCounterPingStatus
    {
        get { return _lapCounterPingStatus; }
        set
        {
            _lapCounterPingStatus = value;
            RaisePropertyChanged(LapCounterPingStatusPropertyName);
        }
    }
}

Pour l'instant, aucune image de surimpression n'est affichée. Qu'est-ce qui pourrait mal se passer?


MISE À JOUR

La fenêtre de trace de mon IDE montre System.ArgumentException et System.FormatException. La source du problème pourrait-elle être un type d’énumération inconnu PingStatus dans le XAML?

89
nabulke

Vous avez besoin de 2 choses pour que cela fonctionne:

1 - Ajoutez une référence xmlns dans l’élément racine de votre fichier XAML, vers l’espace de noms dans lequel votre énumération est définie:

<UserControl ...
xmlns:my="clr-namespace:YourEnumNamespace;Assembly=YourAssembly"> 

2 - dans la propriété Value de la DataTrigger, utilisez le {x:Static} forme:

 <DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static my:PingStatus.PING_UNKNOWN}">

Notez que le type Enum doit être préfixé avec le préfixe xmlns que vous avez défini ci-dessus.

Edit:

Si votre énumération est déclarée dans une classe, vous devez utiliser la syntaxe:

{x:Static namespace:ClassName+EnumName.EnumValue}

par exemple:

{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}

224