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.ArgumentException
y System.FormatException
. ¿Podría la fuente del problema ser un tipo desconocido de enumeración PingStatus
en el XAML?
Respuestas:
Necesita 2 cosas para que esto funcione:
1 - Agregue una
xmlns
referencia en el elemento raíz de su archivo XAML, al espacio de nombres donde se define su Enum:2 - en
Value
propiedad 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
xmlns
así: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 PingStatus
se 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+SpecialFolder
Ejemplo 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
,Warning
oError
.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
Fody
para la vinculación automática.fuente