【问题标题】:Conditional FrameworkElements depending on DataContext取决于 DataContext 的条件 FrameworkElements
【发布时间】:2010-11-15 10:33:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wpf xaml mvvm datatrigger frameworkelement


    【解决方案1】:

    正如您猜对的那样,模板和触发器在这里确实是您的朋友。

    这是一个使用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>
    

    希望这会有所帮助..

    【讨论】:

    • 但是如果没有UserAvatar,那么默认图像呢?另一个内容控件?似乎我需要一个非空的 DataTrigger。我刚刚发现stackoverflow.com/questions/356194/…,它提出了一个自定义的ValueConverter。
    • 呃。应该学会阅读。你的解决方案正是我想要的,Arcturus。在我接受你的回答之前只剩下一点:默认头像不是 ImageSource 而是画布,因此必须以某种方式替换 Image 元素(或隐藏)
    • 它可以工作,只是 DataTemplate 只能有一个孩子。将图像和画布包裹在网格中会有所帮助:)
    • 啊,我的错.. 没有编译它.. ;) 很高兴我能帮上忙!
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2017-09-24
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2012-11-16
    • 2022-01-08
    相关资源
    最近更新 更多