2012-12-17 4 views
68

Ich habe eine Schaltfläche mit einem festen Hintergrundbild und möchte ein kleines Overlay-Bild darüber anzeigen. Welches Overlay-Bild ausgewählt wird, hängt von einer Abhängigkeitseigenschaft (LapCounterPingStatus) des entsprechenden Viewmodels ab.datatrigger on enum um das Bild zu ändern

Das ist, was ich bisher habe:

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

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

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

Gerade jetzt, überhaupt kein Overlay-Bild wird angezeigt. Was könnte falsch sein?


UPDATE

Trace-Fenster meiner IDE ist System.ArgumentException und System.FormatException zeigt. Konnte die Problemquelle ein unbekannter Enumerationstyp PingStatus im XAML sein?

+0

Verwandte: http : //stackoverflow.com/q/10250925/590790 Obwohl dieser Typ es schon funktioniert hat Ady. –

Antwort

170

Sie benötigen 2 Dinge diese Funktion zu erhalten:

1 - eine xmlns Referenz in dem Root-Elemente Ihrer XAML-Datei hinzufügen, auf den Namespace, wo Ihre Enum definiert:

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

2 - in der Value Eigenschaft des DataTrigger, verwenden Sie die {x:Static} Form:

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

Beachten Sie, dass die E num type muss das Präfix xmlns haben, das Sie oben definiert haben.

Edit:

Wenn Ihr Enum innerhalb einer Klasse deklariert ist, müssen Sie die Syntax:

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

zum Beispiel:

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

+0

Ich habe die 'xmlns' folgendermaßen hinzugefügt:' xmlns: local = "clr-namespace: MyCompany.Testbench" 'und der Trigger wie dieser' '. Nein Ich bekomme den Fehler 'Kann den Typ 'PingStatus' nicht finden. – nabulke

+1

'enum PingStatus' ist in der Klasse' MyCompany.TestBench.ConfigurationViewModel' definiert. Muss ich den Klassennamen irgendwo hinzufügen? – nabulke

+0

Es funktioniert mit Ihrer Lösung _wenn ich den 'enum PingStatus' aus dem Klassenbereich verschiebe. Warum? – nabulke

Verwandte Themen