Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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
C# 从其他类更新时更新ListView_C#_Wpf_Listview_Mvvm - Fatal编程技术网

C# 从其他类更新时更新ListView

C# 从其他类更新时更新ListView,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我正在构建一个简单的应用程序,它在一个列表视图中显示特定格式的所有文件。我已经将程序划分为“数据文件”类,在那个里我建立了FileSystemWatcher,若那个里发生了变化。如果有什么变化,我想更新我的Listview,它位于MainWindows.xaml中 因此,我在MainWindow.xaml中有MainWindowViewModel.cs和DataFiles.cs以及ListView。如何将列表从数据文件更新到MainWindow.xaml 我的DataFiles类如果有帮助: p

我正在构建一个简单的应用程序,它在一个列表视图中显示特定格式的所有文件。我已经将程序划分为“数据文件”类,在那个里我建立了FileSystemWatcher,若那个里发生了变化。如果有什么变化,我想更新我的Listview,它位于MainWindows.xaml中

因此,我在MainWindow.xaml中有MainWindowViewModel.cs和DataFiles.cs以及ListView。如何将列表从数据文件更新到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");
    }
publicfilesystemwatcher filewatcher;
公共字符串配置文件源路径;
公共ObservableCollection文件列表{get;protected set;}=new ObservableCollection();
public void InitializeFiles()
{
//创建新的FileSystemWatcher
filewatcher=新的FileSystemWatcher();
//设置过滤器
filewatcher.Filter=“*.txt”;
//设定路径
filewatcher.Path=configurationfilesourcepath;
//订阅创建的事件
filewatcher.Created+=新文件系统EventHandler(FileOnchanged);
filewatcher.Changed+=新的文件系统EventHandler(FileOnchanged);
filewatcher.Deleted+=新文件系统EventHandler(FileOnchanged);
filewatcher.Rename+=新重命名的EventHandler(FileOnRename);
//启用FileSystemWatcher事件
filewatcher.EnableRaisingEvents=true;
刷新文件列表();
}
私有void FileOnchanged(对象发送方、文件系统目标)
{
刷新文件列表();
}
私有void FileOnRenamed(对象发送方,RenamedEventArgs e)
{
刷新文件列表();
}
公共无效刷新文件列表()
{
fileslist.Clear();
//字符串[]getfiles=目录.getfiles(FolderLocation);
DirectoryInfo dir=新的DirectoryInfo(配置文件源路径);
字符串[]扩展名=新的[]{.txt};
int nof=0;
foreach(dir.GetFiles()中的FileInfo文件,其中(f=>extensions.Contains(f.Extension.ToLower()).ToArray())
{
nof++;
添加(新文件()
{
FileId=nof,
FileName=file.Name,
FileChanged=file.LastWriteTime.ToString(),
FileCreated=file.CreationTime.ToString(),
OnlyNameWithoutExtension=Path.GetFileNameWithoutExtension(file.Name)
});
}
NotifyPropertyChanged(“文件列表”);
}
若你们认为我一定是WPF的新手,你们是对的:)若这是一个愚蠢的问题,那个么很抱歉。请帮忙

XAML:


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

DataDiles.PropertyChanged+= DataFiles_PropertyChanged;

public void DataFiles_PropertyChanged(/*...*/)
{
    //Refresh the list
}
要获得更精确的代码,请编辑您的问题并完全添加DataFiles类的定义。

我希望这会有所帮助。

ItemsSource
绑定到
observedcollection
会自动将listview与每个集合的集合同步。Add/Remove/Clear方法调用。因此,我不建议为每个filewatcher事件完全重新制作集合。(如果您有99个文件,并且添加了1个文件,则清除调用将获得1个集合更改事件,100个添加调用将获得100个事件。)相反,您可以尝试将filewatcher事件描述的更改准确地传输到集合更改:filewatcher.Created-->collection.Add;filewatcher.Deleted-->集合。删除;filewatcher。重命名-->集合。删除+集合。添加。但是,如果filewatcher错过了正在创建/删除的文件,您的列表将无法实现更改。(事实上,我不会那么信任filewatcher。)

或者(更简单)您不使用
observateCollection
,而只使用
ArrayList
作为
FilesList
属性的类型。然后,在
清除
添加
调用过程中不会引发任何事件,您可以在
刷新文件列表
结束时调用
NotifyPropertyChanged(“文件列表”)
一次,触发
列表视图
的同步


确保
DataFiles
类实现了
INotifyPropertyChanged
,并且
ListView
DataContext
DataFiles
实例(理想情况下位于视图模型中作为属性)。

您还应该提供XAML。你用过装订吗?是的。我更新帖子(对不起)@esispaned谢谢你的考虑。@esispan没问题,我的朋友。请给我发送数据文件类的第一行。我会解决的。我不希望超过10个文件,所以这不是我的问题。无论如何,谢谢你。
DataDiles.PropertyChanged+= DataFiles_PropertyChanged;

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