Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 取决于DataContext的条件框架元素_Wpf_Xaml_Mvvm_Datatrigger_Frameworkelement - Fatal编程技术网

Wpf 取决于DataContext的条件框架元素

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,

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

<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>