Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 图像绑定在图像中工作,而不是在ItemsControl中_Wpf_Image_Data Binding_Itemscontrol - Fatal编程技术网

Wpf 图像绑定在图像中工作,而不是在ItemsControl中

Wpf 图像绑定在图像中工作,而不是在ItemsControl中,wpf,image,data-binding,itemscontrol,Wpf,Image,Data Binding,Itemscontrol,我在这里有点困惑。我在正在填充的Viewmodel中有一个列表。我试图用ItemsControl在视图上显示列表,但图像不显示。奇怪的是,如果我使用图像标签,我可以访问同一个集合并获得要显示的图像 <ItemsControl ItemsSource="{Binding Path=Images}" MinHeight="80"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate>

我在这里有点困惑。我在正在填充的Viewmodel中有一个列表。我试图用ItemsControl在视图上显示列表,但图像不显示。奇怪的是,如果我使用图像标签,我可以访问同一个集合并获得要显示的图像

<ItemsControl ItemsSource="{Binding Path=Images}" MinHeight="80">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Image Source="{Binding}" MinWidth="80" MinHeight="80" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Image HorizontalAlignment="Left" Name="image1" Stretch="Uniform" VerticalAlignment="Top" Source="{Binding Path=Images[0]}" MinHeight="80" MaxHeight="200" />

请注意,它们都指向图像。图像显示时,ItemsControl保持为空。发生了什么事?

您将通过使用可观察集合而不是列表来解决这个问题。ItemsControl不会在列表的更改通知上重新绑定。如果使用ObservableCollection,也不必担心显式调用列表的更改通知

我能够复制您的场景,只需使用ObservableCollection即可解决问题。至于原因:

具体而言,请参见备注部分的这段引语:

若要在绑定客户端和数据源之间的绑定中发出更改通知,绑定类型应为:实现INotifyPropertyChanged接口(首选)。为绑定类型的每个属性提供更改事件。不要两者都做


代码在我看来是正确的,您如何设置Images属性?你在修改它吗?它会被来自网络的图像填充。我很确定它可以工作,因为图像标签显示第一个图像。是在绑定发生之前还是之后填充您的列表?因为您没有使用ObservaleCollection,如果它先绑定然后填充,ItemsControl将看不到这些项,图像也不会。完成填充后,Viewmodel将使用INotifyPropertyChanged。引用:这样图像也不会。。。实际上,INotifyPropertyChanged对图像有效,但对列表无效。你是对的,但我很好奇为什么列表在调用INotifyPropertyChanged后不会更新。@Tyrsius:如果你有一个新列表,并且使用INotifyPropertyChanged,它会更新。如果你只是修改一个现有的列表,包括清除它和重新填充它,则不会,因为你的属性仍然指向同一个列表。@MattBurland啊,这是有道理的。没有办法让列表更新其集合,然后使用INotifyPropertyChanged吗?@Tyrsius:您可以a用列表的新实例替换它,或者b将属性设置为null,然后返回列表。这两个选项都不比使用ObservableCollection好。