DataContextに依存する条件付きFrameworkElements
-
05-07-2019 - |
質問
M-V-VMアプリケーションでは、ユーザーのアバターを表示する必要があります。画像は、ViewModelオブジェクトのImageSource型のプロパティで提供されます。それが私が現在持っているものです:
<Image Source="{Binding Path=UserAvatar}"/>
ただし、一部のユーザーにはアバターが設定されていない可能性があるため、UserAvatarは null
です。その場合、デフォルトのアバターを表示します。ビュー以外は誰もデフォルトの画像について知る必要はありません。なぜなら、それは単にプレゼンテーションの問題だからです。
では、指定されたImageSourceで画像を表示する方法、またはImageSourceが null
の場合に特定のリソースを表示するにはどうすればよいですか。 DataTriggersで何らかのDataTemplateを使用する必要がありますか?今からItemsControlsにのみ使用しているので、わかりません。
解決
あなたが正しく推測したように、テンプレートとトリガーは確かにあなたの友人です。
これは、 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>
そして、デフォルトのものが ImageSource
でなく、他のコントロールで少し遊んでみたいという状況では、いつでも Visibilty
プロパティに頼ることができます:
<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>
これが役立つことを願って..
所属していません StackOverflow