Ich habe eine Schaltfläche mit einem festen Hintergrundbild und möchte ein kleines Überlagerungsbild darüber anzeigen. Welches Overlay-Bild ausgewählt werden soll, hängt von einer Abhängigkeitseigenschaft ( LapCounterPingStatus
) des entsprechenden Ansichtsmodells ab.
Das habe ich bisher bekommen:
<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>
Relevante Teile meines Ansichtsmodells
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
Derzeit wird überhaupt kein Überlagerungsbild angezeigt. Was könnte falsch sein?
AKTUALISIEREN
Das Trace-Fenster meiner IDE wird angezeigt System.ArgumentException
und System.FormatException
. Könnte die Problemquelle eine unbekannte Art der Aufzählung in PingStatus
der XAML sein?
Antworten:
Sie benötigen zwei Dinge, um dies zum Laufen zu bringen:
1 - Fügen
xmlns
Sie im Namespace, in dem Ihre Enum definiert ist, eine Referenz im Stammelement Ihrer XAML-Datei hinzu:2 - Verwenden Sie in der
Value
Eigenschaft vonDataTrigger
das folgende{x:Static}
Formular:Beachten Sie, dass dem Aufzählungstyp das oben definierte XML-Präfix vorangestellt werden muss.
Bearbeiten:
Wenn Ihre Aufzählung in einer Klasse deklariert ist, müssen Sie die folgende Syntax verwenden:
{x:Static namespace:ClassName+EnumName.EnumValue}
beispielsweise:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
quelle
xmlns
Folgende hinzugefügt :xmlns:local="clr-namespace:MyCompany.Testbench"
und den Auslöser so<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Nein, ich bekomme den FehlerCannot find the type 'PingStatus'
.enum PingStatus
wird innerhalb der Klasse definiertMyCompany.TestBench.ConfigurationViewModel
. Muss ich den Klassennamen irgendwo hinzufügen?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Vollständiges Beispiel für WPF + MVVM.
Getestet am MSVC 2017.
In der Ansicht:
Bei der Verwendung von ReSharper, und wenn die Datacontext richtig eingerichtet ist, wird es Intellisense, wenn Sie den Hit
.
nachStatusIcon
, dh er die Eigenschaften des ENUM zeigen , die sindDebug
,Info
,Warning
oderError
.Wenn Sie ReSharper verwenden, wird die folgende Aktualisierung des Namespace im Header für die XAML-Datei vorgeschlagen (es ist gut so):
Und das VieModel:
Wir verwenden auch
Fody
für die automatisierte Bindung.quelle