在ListBox中加载图像列表.WPF和MVVM

本文关键字:WPF MVVM 列表 图像 ListBox 加载 | 更新日期: 2023-09-27 18:26:38

我正试图显示ListBox中目录中的一组图片。当我选择另一个目录时,应该更新此ListBox。下面的代码不能正常工作,我不知道为什么。LoadImages()工作正常,因为_selectedImageList包含选定目录中包含的元素,但ListBox不显示任何内容。

XAML:

<ListBox x:Name="ListBoxSnapshots" ItemsSource="{Binding SelectedImageList, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Focusable="False" BorderThickness="0" SelectionMode="Single" HorizontalContentAlignment="Left" VerticalContentAlignment="Stretch" SelectionChanged="ListBoxSnapshots_SelectionChanged" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Disabled" SelectedIndex="0" >
   <ListBox.ItemTemplate>
       <DataTemplate>
           <StackPanel>
               <Image Source="{Binding}" Stretch="Fill" />
           </StackPanel>
       </DataTemplate>
   </ListBox.ItemTemplate>
   <ListBox.ItemsPanel>
       <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" Orientation="Horizontal" />
       </ItemsPanelTemplate>
   </ListBox.ItemsPanel>
</ListBox>

我的视图模型:

private ObservableCollection<ImageSource> _selectedImageList = new ObservableCollection<ImageSource>();
public ObservableCollection<ImageSource> SelectedImageList
{
   get { return _selectedImageList; }
   set { _selectedImageList = value; }
}
private void LoadImages()
{
   _selectedImageList = new ObservableCollection<ImageSource>();
   DirectoryInfo aSnapshotTempDir = new DirectoryInfo(@"..'..'Images");
   foreach (FileInfo aFile in aSnapshotTempDir.GetFiles("*.jpg"))
   {
       Uri uri = new Uri(aFile.FullName);
       _selectedImageList.Add( new BitmapImage( uri ) );
   }
}

我正试图做类似的事情(在WPF MVVM中使用数据绑定在ListView中显示图像(或者更好的东西!)),但我的代码中出现了问题。

谢谢。

在ListBox中加载图像列表.WPF和MVVM

有两个问题:
I.您不绑定为您的ObservableCollection公开的public属性。

ItemsSource="{Binding SelectedImageList"}

II。这里的问题是,由于ListBox的绑定中断,每次在LoadImages方法中使用新引用初始化ObservableCollection对象
这可以通过两种方法解决:
1.通过PropertyChangedINotifyPropertyChanged)通知视图集合已更改。

public ObservableCollection<ImageSource> SelectedImageList
{
   get { return _selectedImageList; }
   set { _selectedImageList = value; 
       SendPropertyChanged("SelectedImageList"); // suppose you have implemented INotifyPropertyChanged interface in this method.
       }
}
  1. 清除集合并添加新项目。

     private void LoadImages()
     {
         _selectedImageList.Clear();
         DirectoryInfo aSnapshotTempDir = new DirectoryInfo(@"..'..'Images");
         foreach (FileInfo aFile in aSnapshotTempDir.GetFiles("*.jpg"))
         {
             Uri uri = new Uri(aFile.FullName);
            _selectedImageList.Add( new BitmapImage( uri ) );
          }
     }
    

根据最佳实践,您应该执行步骤2,因为初始化可观察的集合指的是堆中的新地址,并且通知查看以在主线程中新绑定新集合将以资源为中心以提高性能。