c# - 当另一个类更新时更新 ListView

标签 c# wpf listview mvvm

我正在构建简单的应用程序,它在一个 ListView 中显示某种格式的所有文件。我已将程序划分为“DataFiles”类,如果那里发生变化,我会在其中建立 FileSystemWatcher 。如果发生变化,那么我想更新放置在 MainWindows.xaml 中的 Listview。

所以我在 MainWindow.xaml 中有 MainWindowViewModel.cs 和 DataFiles.cs 以及 ListView。如何将列表从 DataFiles 更新到 MainWindow.xaml?

我的 DataFiles 类(如果有帮助):

public FileSystemWatcher filewatcher;
    public string ConfigurationFilesSourcePath;
    public ObservableCollection<Files> fileslist { get; protected set; } = new ObservableCollection<Files>();

    public void InitializeFiles()
    {
        // Create a new FileSystemWatcher
        filewatcher = new FileSystemWatcher();

        // Set filter
        filewatcher.Filter = "*.txt";

        // Set the path
        filewatcher.Path = ConfigurationFilesSourcePath;

        // Subscribe to the Created event
        filewatcher.Created += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Changed += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Deleted += new FileSystemEventHandler(FileOnchanged);
        filewatcher.Renamed += new RenamedEventHandler(FileOnRenamed);

        // Enable the FileSystemWatcher events
        filewatcher.EnableRaisingEvents = true;

        RefreshFilesList();
    }

    private void FileOnchanged(object sender, FileSystemEventArgs e)
    {
        RefreshFilesList();
    }

    private void FileOnRenamed(object sender, RenamedEventArgs e)
    {
        RefreshFilesList();
    }

    public void RefreshFilesList()
    {
        fileslist.Clear();

        //string[] getfiles = Directory.GetFiles(FolderLocation);
        DirectoryInfo dir = new DirectoryInfo(ConfigurationFilesSourcePath);

        string[] extensions = new[] { ".txt" };

        int nof = 0;
        foreach (FileInfo file in dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray())
        {
            nof++;

            fileslist.Add(new Files()
            {
                FileId = nof,
                FileName = file.Name,
                FileChanged = file.LastWriteTime.ToString(),
                FileCreated = file.CreationTime.ToString(),
                OnlyNameWithoutExtension = Path.GetFileNameWithoutExtension(file.Name)
            });
        }

        NotifyPropertyChanged("fileslist");
    }

如果您认为我对 WPF 一定很陌生,那么您是对的:) 如果这是一个愚蠢的问题,那么抱歉。请帮忙。

XAML:

<ListView Name="lvfiles" Grid.Row="4" ItemsSource="{Binding fileslist}" SelectionMode="Single" SelectedItem="{Binding SelectedFiles}" DataContext="{Binding }" Style="{StaticResource ListView}">
                        <ListView.View>
                            <GridView x:Name="gridFiles">
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn x:Name="FileId" Header="#" DisplayMemberBinding="{Binding FileId}" Width="Auto"/>

                                <GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" Width="Auto">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBox  Text="{Binding FileName, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" BorderThickness="0" Style="{StaticResource ListViewTextBoxes}"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>

                                <!--<GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" DisplayMemberBinding="{Binding FileName}" Width="Auto"/>-->
                                <GridViewColumn x:Name="FileCreated" Header="{inf:Loc ConfigurationsCreated}" DisplayMemberBinding="{Binding FileCreated}" Width="Auto"/>
                                <GridViewColumn x:Name="FileChanged" Header="{inf:Loc ConfigurationsChanged}" DisplayMemberBinding="{Binding FileChanged}" Width="Auto"/>
                            </GridView>
                        </ListView.View>
                    </ListView>

最佳答案

在主菜单中,您应该为 PropertyChanged 事件分配一个处理程序,并在其中更新列表。

DataDiles.PropertyChanged+= DataFiles_PropertyChanged;

public void DataFiles_PropertyChanged(/*...*/)
{
    //Refresh the list
}

要获得更准确的代码,请编辑您的问题并完全添加 DataFiles 类的定义。
我希望它会有所帮助。

关于c# - 当另一个类更新时更新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32226048/

相关文章:

c# - Windows 7 : A generic error occurred in GDI+ 中的编译器问题

c# - 如何在遵循 MVVM 格式的同时访问子 ViewModel 中的事件

java - 我的申请历史

java - 将另一个 EditText 值插入到 Android 数据库中?

c# - 如何将列表转换为数据表

c# - ASP.NET 核心 DI : Resolve same instance if scoped service is registered both as service type and implementation type

c# - 如何将 WPF 窗口添加到类库项目

wpf - 我们现在应该将WPF应用程序迁移到UWP应用程序吗?

android - 将 ListView 中复选框的检查限制为 3

c# - Azure 文件存储 SMB 列出目录中的文件速度很慢