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