我有兩個 DataGrids“DG1”和“DG2”以及兩個自定義類“TxtFiles”和“MFiles”。我正在使用 FileSystemWatcher 類來監視兩個目錄。我將加載的資料從一個目錄分配給ObservableCollection<FileFinfo>. 到現在為止一切正常。之后,我操作資料并將其傳遞給另一個ObservableCollection<TxtFiles>我希望顯示在我的 DataGrid DG1 中的資料(我對第二個目錄和 DG2 以及我的“MFiles”類執行相同操作)。但是,在目錄中添加或洗掉檔案時,DataGrid 不會更新。
我的 XAML 代碼:
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid x:Name="DG1"/>
<DataGrid x:Name="DG2" Grid.Row="1"/>
<Button Content="Execute" Grid.Row="2"/>
</Grid>
文本檔案類:
public class TxtFiles
{
public string Name { get; set; }
public string No1 { get; set; }
public string No2 { get; set; }
public string No3 { get; set; }
public TxtFiles(string name, string n01, string no2, string no3)
{
Name = name;
No1 = n01;
No2 = no2;
No3 = no3;
}
}
檔案觀察類:
internal class FileWatcher
{
private readonly object filesLock = new object();
private ObservableCollection<FileInfo> _files = new ObservableCollection<FileInfo>();
public ObservableCollection<FileInfo> Files
{
get
{
return _files;
}
set
{
_files = value;
}
}
public FileWatcher(string path)
{
BindingOperations.EnableCollectionSynchronization(Files, filesLock);
lock (filesLock)
{
foreach (var fileInfo in new DirectoryInfo(path).EnumerateFiles())
{
Files.Add(fileInfo);
}
}
var fsw = new FileSystemWatcher(path);
fsw.Created = FileCreated;
fsw.Deleted = FileDeleted;
fsw.EnableRaisingEvents = true;
}
private void FileCreated(object sender, FileSystemEventArgs e)
{
lock (filesLock)
{
Files.Add(new FileInfo(e.Name));
}
}
private void FileDeleted(object sender, FileSystemEventArgs e)
{
var removed = Files.FirstOrDefault(fi => fi.Name == e.Name);
if (removed != null)
{
lock (filesLock)
{
Files.Remove(removed);
}
}
}
}
我的代碼背后:
public partial class MainWindow : Window
{
ObservableCollection<TxtFiles> TFiles = new ObservableCollection<TxtFiles>();
ObservableCollection<MFiles> M_Files = new ObservableCollection<MFiles>();
ObservableCollection<FileInfo> LoadedFiles1 = new ObservableCollection<FileInfo>();
public MainWindow()
{
InitializeComponent();
LoadedFiles1 = new FileWatcher("C:\\User\\").Files;
foreach (FileInfo file in LoadedFiles1)
{
TFiles.Add(FileInfoToTxtFiles(file.Name));
}
DG1.ItemsSource = TFiles;
//LoadedFiles1.CollectionChanged = LoadedFiles_CollectionChanged;
}
//Convert loaded directory files into TxTFiles
public static TxtFiles FileInfoToTxtFiles(string file)
{
string[] temp = file.ToString().Split('_', '.');
TxtFiles txtFile = new TxtFiles(temp[0], temp[1], temp[2], temp[3]);
return txtFile;
}
//private void LoadedFiles_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
//{
// foreach(var file in e.NewItems)
// {
// TFiles.Add(FileInfoToTxtFiles(file));
// }
//}
}
我嘗試使用 ObservableCollection 的 CollectionChanged 事件但沒有成功。也許有人有小費?非常感謝!
uj5u.com熱心網友回復:
添加或洗掉檔案時ObservableCollection<FileInfo>將引發FileWatcher事件。CollectionChanged
TxtFiles您可以處理此事件并從中添加和洗掉ObservableCollection<TxtFiles>:
public MainWindow()
{
InitializeComponent();
LoadedFiles1 = new FileWatcher("C:\\User\\").Files;
foreach (FileInfo file in LoadedFiles1)
{
TFiles.Add(FileInfoToTxtFiles(file.Name));
}
LoadedFiles1.CollectionChanged = (s, e) =>
{
if (e.NewItems != null)
foreach (var addedItem in e.NewItems.OfType<FileInfo>())
TFiles.Add(FileInfoToTxtFiles(addedItem.Name));
if (e.OldItems != null)
foreach (var removedItems in e.OldItems.OfType<FileInfo>())
{
var tFile = ...;
TFiles.Remove(Tfile);
}
};
DG1.ItemsSource = TFiles;
}
您將不得不弄清楚如何找到TxtFiles要洗掉的相應物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535136.html
標籤:C#wpf
