C# 如何更新ObservableCollection?

C# 如何更新ObservableCollection?,c#,wpf,image,listbox,observablecollection,C#,Wpf,Image,Listbox,Observablecollection,我有一个包含图像的文件夹,显示在我的列表框中。ObservableCollection存储该图像。在我的程序中,用户可以裁剪选定的图像,裁剪后保存该图像。问题是,保存图像后,我的ObservableCollection没有更新(尽管OnPropertyChange事件是rise),并且显示相同的图像。有人有同样的问题吗 编辑 <ScrollViewer Grid.Column="2"> <ListView x:Name="PhotoListView" B

我有一个包含图像的文件夹,显示在我的列表框中。ObservableCollection存储该图像。在我的程序中,用户可以裁剪选定的图像,裁剪后保存该图像。问题是,保存图像后,我的ObservableCollection没有更新(尽管OnPropertyChange事件是rise),并且显示相同的图像。有人有同样的问题吗

编辑

    <ScrollViewer Grid.Column="2">
        <ListView x:Name="PhotoListView" BorderThickness="0" 
                      ItemsSource="{Binding PhotoList, UpdateSourceTrigger=PropertyChanged}">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <controls:Tile Style="{StaticResource TileStyle}">
                        <StackPanel Background="White" Width="190" Height="140" Orientation="Vertical">
                            <Image Margin="5" Width="180" Height="110" Stretch="Fill" Source="{Binding BitmapImage}"/>
                            <TextBlock Text="{Binding ShortFileName}" TextAlignment="Center"  Height="20" FontStyle="Italic" FontWeight="ExtraLight" Foreground="Black"></TextBlock>
                        </StackPanel>
                    </controls:Tile>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="MouseDoubleClick" Handler="ItemMouseDoubleClick"></EventSetter>
                    <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ItemMouseClick"></EventSetter>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </ScrollViewer>
我有一个BindingManager,我将可观察到的集合放在那里

public class BindingsManager:INotifyPropertyChanged
{
    private ObservableCollection<PhotoModel> _photoList;

    public ObservableCollection<PhotoModel> PhotoList
    {
        get {return _photoList;}
        set
        {
            _photoList = value;
            OnPropertyChanged(nameof(PhotoList));
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
在更改事件中,我更新了ObservableCollection,但它不起作用:

   private void UpdatePhotoList()
    {
        var files = Directory.GetFiles(BindingsManager.DefaultsManager.DefaultDestFolder, "*.*");
        BindingsManager.PhotoList = new ObservableCollection<PhotoModel>();

        foreach (var file in files)
        {
            Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                var fileInfo = new FileInfo(file);

                BitmapImage img = new BitmapImage();
                img.BeginInit();
                img.CacheOption = BitmapCacheOption.OnLoad;
                img.UriSource = new Uri(file, UriKind.Absolute);
                img.EndInit();
                BindingsManager.PhotoList.Add(new PhotoModel()
                {
                    BitmapImage = img,
                    FullFileName = fileInfo.FullName,
                    ShortFileName = fileInfo.Name,
                    FileLastAccessTime = fileInfo.LastAccessTime,
                    FileSize = fileInfo.Length,
                    Width = (int)img.Width,
                    Height = (int)img.Height,
                    DirectoryName = fileInfo.DirectoryName,
                    FileCreationTime = fileInfo.CreationTime
                });
            }));
        }          
    }
private void UpdatePhotoList()
{
var files=Directory.GetFiles(BindingsManager.DefaultsManager.DefaultDestFolder,“**”);
BindingsManager.PhotoList=新的ObservableCollection();
foreach(文件中的var文件)
{
Application.Current.Dispatcher.Invoke((操作)(()=>
{
var fileInfo=新文件信息(文件);
BitmapImage img=新的BitmapImage();
img.BeginInit();
img.CacheOption=BitmapCacheOption.OnLoad;
img.UriSource=新Uri(文件,UriKind.Absolute);
img.EndInit();
BindingsManager.PhotoList.Add(新的PhotoModel()
{
BitmapImage=img,
FullFileName=fileInfo.FullName,
ShortFileName=fileInfo.Name,
FileLastAccessTime=fileInfo.LastAccessTime,
FileSize=fileInfo.Length,
宽度=(int)img.Width,
高度=(int)img.Height,
DirectoryName=fileInfo.DirectoryName,
FileCreationTime=fileInfo.CreationTime
});
}));
}          
}
编辑

    <ScrollViewer Grid.Column="2">
        <ListView x:Name="PhotoListView" BorderThickness="0" 
                      ItemsSource="{Binding PhotoList, UpdateSourceTrigger=PropertyChanged}">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <controls:Tile Style="{StaticResource TileStyle}">
                        <StackPanel Background="White" Width="190" Height="140" Orientation="Vertical">
                            <Image Margin="5" Width="180" Height="110" Stretch="Fill" Source="{Binding BitmapImage}"/>
                            <TextBlock Text="{Binding ShortFileName}" TextAlignment="Center"  Height="20" FontStyle="Italic" FontWeight="ExtraLight" Foreground="Black"></TextBlock>
                        </StackPanel>
                    </controls:Tile>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="MouseDoubleClick" Handler="ItemMouseDoubleClick"></EventSetter>
                    <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ItemMouseClick"></EventSetter>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </ScrollViewer>


我认为绑定不是您的主要问题。您应该检查图像缓存。试试看:

我认为绑定不是你的主要问题。您应该检查图像缓存。Try:

请发布一些代码以了解您的操作,并找出问题所在。ObservableCollections中已包含INotifyChanged接口,无需执行两次,这可能会导致问题。我删除了INotifyPropertyChanged接口,但仍然存在相同的问题。您可以显示列表框的XAML吗?您是在更新集合中的项目还是只是添加/删除项目?请发布一些代码以了解您的操作,并解决问题。ObservableCollections中已包含INotifyChanged接口,无需执行两次,这可能会导致问题。我已删除INotifyPropertyChanged接口,但仍然存在相同的问题。是否可以显示列表框的XAML?是否正在更新集合中的项,或者只是添加/删除项?
    <ScrollViewer Grid.Column="2">
        <ListView x:Name="PhotoListView" BorderThickness="0" 
                      ItemsSource="{Binding PhotoList, UpdateSourceTrigger=PropertyChanged}">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <controls:Tile Style="{StaticResource TileStyle}">
                        <StackPanel Background="White" Width="190" Height="140" Orientation="Vertical">
                            <Image Margin="5" Width="180" Height="110" Stretch="Fill" Source="{Binding BitmapImage}"/>
                            <TextBlock Text="{Binding ShortFileName}" TextAlignment="Center"  Height="20" FontStyle="Italic" FontWeight="ExtraLight" Foreground="Black"></TextBlock>
                        </StackPanel>
                    </controls:Tile>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <EventSetter Event="MouseDoubleClick" Handler="ItemMouseDoubleClick"></EventSetter>
                    <EventSetter Event="PreviewMouseLeftButtonUp" Handler="ItemMouseClick"></EventSetter>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </ScrollViewer>