Wpf 取决于DataContext的条件框架元素
在我的M-V-VM应用程序中,我必须显示用户的化身。图像在ViewModel对象的ImageSource类型的属性中提供。这就是我目前的情况:Wpf 取决于DataContext的条件框架元素,wpf,xaml,mvvm,datatrigger,frameworkelement,Wpf,Xaml,Mvvm,Datatrigger,Frameworkelement,在我的M-V-VM应用程序中,我必须显示用户的化身。图像在ViewModel对象的ImageSource类型的属性中提供。这就是我目前的情况: <Image Source="{Binding Path=UserAvatar}"/> 然而,一些用户可能没有配置化身,因此UserAvatar是null。在这种情况下,我想显示一个默认的化身。但是视图必须知道默认图像,因为它只是一个表示问题 因此,如何显示具有给定ImageSource的图像,或者如果ImageSource为null,
<Image Source="{Binding Path=UserAvatar}"/>
然而,一些用户可能没有配置化身,因此UserAvatar是null
。在这种情况下,我想显示一个默认的化身。但是视图必须知道默认图像,因为它只是一个表示问题
因此,如何显示具有给定ImageSource的图像,或者如果ImageSource为
null
,如何显示特定的资源。我是否必须在DataTriggers中使用某种类型的DataTemplate?因为现在我只将它们用于ItemsControl,所以我不知道。正如您正确猜测的,模板和触发器确实是您的朋友
下面是一个使用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>
希望这会有所帮助。但是如果没有用户头像,那么默认图像如何?另一个ContentControl?似乎我需要一个非空的DataTrigger。我刚刚发现,它提出了一个自定义值转换器。我们应该学会阅读。你的解决方案正是我想要的,大角星。在我接受你的答案之前,只剩下一点:默认的化身不是图像源,而是画布,因此图像元素必须以某种方式替换(或隐藏)才能正常工作,除了DataTemplate只能有一个子项。将图像和画布包装在网格中有助于:)啊,我的糟糕。。我没有编译它很高兴我能帮忙!
<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>