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 elegir depende de una propiedad de dependencia ( LapCounterPingStatus) del modelo de vista correspondiente.
Esto es lo que tengo 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 superpuesta. ¿Qué podría estar mal?
ACTUALIZAR
Se muestra la ventana de seguimiento de mi IDE System.ArgumentExceptiony System.FormatException. ¿Podría la fuente del problema ser un tipo desconocido de enumeración PingStatusen el XAML?

Respuestas:
Necesita 2 cosas para que esto funcione:
1 - Agregue una
xmlnsreferencia en el elemento raíz de su archivo XAML, al espacio de nombres donde se define su Enum:2 - en
Valuepropiedad delDataTrigger, use el{x:Static}formulario:Tenga en cuenta que el tipo Enum debe tener el prefijo xmlns que definió anteriormente.
Editar:
Si su Enum se declara dentro de una clase, debe usar la sintaxis:
{x:Static namespace:ClassName+EnumName.EnumValue}por ejemplo:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}fuente
xmlnsasí:xmlns:local="clr-namespace:MyCompany.Testbench"y el disparador así<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">. No, me sale el errorCannot find the type 'PingStatus'.enum PingStatusse define dentro de la claseMyCompany.TestBench.ConfigurationViewModel. ¿Tengo que agregar el nombre de la clase en alguna parte?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolderEjemplo completo trabajado para WPF + MVVM.
Probado en MSVC 2017.
En la vista:
Si se utiliza ReSharper, y si el DataContext está configurado correctamente, habrá IntelliSense cuando se pulse el
.despuésStatusIcon, es decir, que mostrará las propiedades de la enumeración que sonDebug,Info,WarningoError.Si usa ReSharper, sugerirá la siguiente actualización del espacio de nombres en el encabezado del archivo XAML (es bueno así):
Y el VieModel:
También utilizamos
Fodypara la vinculación automática.fuente