Pregunta datatrigger en enum para cambiar la imagen


Tengo un botón con una imagen de fondo fija y me gustaría mostrar una pequeña imagen superpuesta encima. Qué imagen de superposición para elegir depende de una propiedad de dependencia (LapCounterPingStatus) de acuerdo con el modelo de vista.

Esto es lo que obtuve hasta ahora:

<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>

Partes relevantes de mi modelo de vista

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

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

En este momento, no se muestra ninguna imagen de superposición. ¿Qué podría estar mal?


ACTUALIZAR

La ventana de rastreo de mi IDE muestra System.ArgumentException y System.FormatException. ¿Podría el origen del problema ser un tipo desconocido de enumeración? PingStatus soy el XAML?


73
2017-12-17 15:28


origen


Respuestas:


Necesitas 2 cosas para que esto funcione:

1 - Agregue un xmlns referencia en el elemento raíz de su archivo XAML, al espacio de nombres donde se define su Enum:

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

2 - en el Value propiedad de la DataTrigger, utilizar el {x:Static} formar:

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

Tenga en cuenta que el tipo Enum debe ir precedido del prefijo xmlns que definió anteriormente.

Editar:

Si tu Enum se declara dentro de una clase, debes usar la sintaxis:

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

por ejemplo:

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


186
2017-12-17 15:48