条件FrameworkElements取决于DataContext

时间:2009-07-30 12:56:36

标签: wpf xaml mvvm datatrigger frameworkelement

在我的M-V-VM应用程序中,我必须显示用户的头像。该图像在ViewSodel对象的ImageSource类型的属性中提供。这就是我目前所拥有的:

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

但是,某些用户可能没有配置头像,因此UserAvatar为null。在这种情况下,我想显示一个默认的头像。没有人,但视图必须知道默认图像,因为它只是表示的一个问题。

那么我如何使用给定的ImageSource显示图像,或者如果ImageSource为null则显示特定的资源。我是否必须在DataTriggers中使用某种DataTemplate?从现在开始我只将它们用于ItemsControls,所以我不知道。

1 个答案:

答案 0 :(得分:6)

正如您猜对,模板和触发器确实是您的朋友。

以下是使用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>

希望这会有所帮助..