2009-07-30 2 views
3

Dans mon application M-V-VM, je dois montrer l'avatar de l'utilisateur. L'image est fournie dans une propriété de type ImageSource l'objet ViewModel. Alors voilà ce que j'ai actuellement:FrameworkElements conditionnel en fonction de DataContext

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

Cependant, certains utilisateurs ne peuvent pas avoir un avatar configuré, donc useravatar est null. Dans ce cas, je veux montrer un avatar par défaut. Personne, mais la vue doit connaître l'image par défaut, car c'est juste une question de présentation.

Alors, comment puis-je montrer l'image avec l'ImageSource donné, ou une ressource spécifique si ImageSource est null. Dois-je utiliser une sorte de DataTemplate avec DataTriggers? Depuis maintenant je les ai seulement utilisés pour ItemsControls, donc je ne sais pas.

Répondre

6

Comme vous l'avez deviné correctement, les modèles et les déclencheurs sont en effet votre ami ici.

est ici une mise en œuvre à l'aide du 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> 

Et dans la situation où votre défaut thingy est pas ImageSource, et que vous souhaitez jouer un peu avec d'autres, vous pouvez toujours avoir recours à la Visibilty propriété:

<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 helps ..

+1

+1 me devança :) –

+0

Mais que diriez-vous l'image par défaut s'il n'y a pas UserAvatar? Un autre ContentControl? Il semble que j'ai besoin d'un DataTrigger non nul. Je viens de découvrir http://stackoverflow.com/questions/356194/wpf-datatrigger-where-value-is-not-null, qui propose un ValueConverter personnalisé. –

+0

D'accord. Devrait apprendre à lire. Tu es la solution, c'est exactement ce que je cherchais, Arcturus. Il ne reste plus qu'un point avant que j'accepte votre réponse: l'avatar par défaut n'est pas un ImageSource mais une toile, donc l'élément Image doit être remplacé en quelque sorte (ou caché) –