Wpf 图像绑定在图像中工作,而不是在ItemsControl中
我在这里有点困惑。我在正在填充的Viewmodel中有一个列表。我试图用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>
<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好。