Bedingte FrameworkElements abhängig von Datacontext
-
05-07-2019 - |
Frage
In meiner M-V-VM-Anwendung muß ich den Avatar des Benutzers zeigen. Das Bild wird in eine Eigenschaft des Typs Image das Objekt Ansichtsmodell zur Verfügung gestellt. Also das ist, was habe ich zur Zeit:
<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 ein Standardbild zeigen. Noone, aber die Aussicht muss über das Standardbild kennen, weil es nur ein Anliegen der Präsentation ist.
Wie kann ich also entweder das Bild mit dem angegebenen Image zeigen, oder einer bestimmten Ressource, wenn Image null
ist. Muss ich irgendeine Art von Datatemplate mit DataTriggers bedienen? Da jetzt habe ich sie nur für ItemsControls, so weiß ich nicht.
Lösung
Wie Sie richtig erraten, Vorlagen und Auslöser sind in der Tat Ihr Freund hier.
Hier ist eine Implementierung mit der 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 Visibilty
Eigenschaft zurückgreifen:
<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, das hilft ..