2009-07-30 13 views
3

In meiner M-V-VM-Anwendung muss ich den Avatar des Benutzers zeigen. Das Bild wird in einer Eigenschaft vom Typ ImageSource des ViewModel-Objekts bereitgestellt. Also das ist, was ich habe zur Zeit:Conditional FrameworkElements in Abhängigkeit von DataContext

<Image Source="{Binding Path=UserAvatar}"/> 

Jedoch können einige Benutzer nicht haben ein Avatar konfiguriert, so useravatar null ist. In diesem Fall möchte ich einen Standardavatar zeigen. Nur die Ansicht muss über das Standardbild wissen, da es sich nur um eine Präsentation handelt.

Also wie kann ich entweder das Bild mit der angegebenen ImageSource anzeigen, oder eine bestimmte Ressource, wenn ImageSource null ist. Muss ich eine Art DataTemplate mit DataTriggers verwenden? Da ich sie jetzt nur für ItemsControls verwendet habe, weiß ich es nicht.

Antwort

6

Wie Sie richtig geraten haben, sind Vorlagen und Trigger in der Tat Ihr Freund hier. Hier

ist eine Implementierung der Verwendung von ContentControl:

<ContentControl Content="{Binding Path=UserAvatar}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <Image x:Name="image" Source="{Binding}"/> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding}" Value="{x:Null}"> 
        <Setter TargetName="image" Property="Source" Value="--your awesome default image here--" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

Und in der Situation, wenn Ihr Standard-Dingen nicht ImageSource ist, und Sie wünschen, um ein wenig mit anderen Steuerungen zu spielen, können Sie sich immer auf die zurückgreifen Visibilty Immobilie:

<ContentControl Content="{Binding Path=UserAvatar}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <Grid> 
       <Image x:Name="image" Source="{Binding}" /> 
       <Canvas x:Name="defaultImage" Visibility="Collapsed" /> 
      </Grid> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding}" Value="{x:Null}"> 
        <Setter TargetName="image" Property="Visibility" Value="Collapsed" /> 
        <Setter TargetName="defaultImage" Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

Hope this ..

+1

+1 schlagen mich, es hilft :) –

+0

Aber wie wäre es das Standardbild, wenn kein UserAvatar vorhanden ist? Ein anderes ContentControl? Scheint, dass ich einen not-null DataTrigger brauche. Ich habe gerade http://stackoverflow.com/questions/356194/wpf-datatrigger-where-value-is-not-null entdeckt, das einen benutzerdefinierten ValueConverter vorschlägt. –

+0

D'uh. Sollte lernen zu lesen. Deine Lösung ist genau das, wonach ich gesucht habe, Arcturus. Es gibt nur noch einen Punkt, bevor ich deine Antwort akzeptiere: Der Standard-Avatar ist keine ImageSource, sondern ein Canvas, also muss das Image-Element irgendwie ersetzt werden (oder versteckt) –