如何使用MVVM模式删除树视图项



我正在使用C#WPF中的MVVM模式制作一个文件资源管理器应用程序。现在,我想实现负责从树视图中添加、删除和重命名项的观察者事件。我已经添加了,并部分重命名(我认为在这种情况下,我必须将删除和添加结合起来(。我很难删除。

已删除的文件仍在树视图中。例如,文件夹不应该再存在了,因为我删除了它

应用程序窗口

我非常感谢你的帮助。这是我在DirectoryInfoViewModel 类中编写的一段代码

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
namespace ViewModels {
public class DirectoryInfoViewModel : FileSystemInfoViewModel
{
public ObservableCollection<FileSystemInfoViewModel> Items { get; private set; }  = new ObservableCollection<FileSystemInfoViewModel>();
public bool Open(string path)
{
bool result = false;

try
{
FileSystemWatcher Watcher = new FileSystemWatcher(path);
Watcher.Created += OnFileCreated;
Watcher.Renamed += OnFileRenamed;
Watcher.Deleted += OnFileDeleted;
//Watcher.Changed += OnFileChanged;
Watcher.Error += Watcher_Error;
Watcher.EnableRaisingEvents = true;
foreach (var dirName in Directory.GetDirectories(path))
{
var dirInfo = new DirectoryInfo(dirName);
DirectoryInfoViewModel itemViewModel = new DirectoryInfoViewModel
{
Model = dirInfo
};
itemViewModel.Open(dirName);
Items.Add(itemViewModel);
}

foreach (var fileName in Directory.GetFiles(path))
{
var fileInfo = new FileInfo(fileName);
FileInfoViewModel itemViewModel = new FileInfoViewModel();
itemViewModel.Model = fileInfo;
Items.Add(itemViewModel);
}
result = true;
}
catch (Exception ex)
{
Exception = ex;
}
return result;
}
public Exception Exception { get; private set; }


private static void Watcher_Error(object sender, ErrorEventArgs e) =>
System.Windows.MessageBox.Show(e.GetException().ToString());

public void OnFileCreated(object sender, FileSystemEventArgs e)
{
System.Windows.Application.Current.Dispatcher.Invoke(() => OnFileCreated(e));
}
private void OnFileCreated(FileSystemEventArgs e)
{
Debug.WriteLine("File Created: " + e.Name);
if (!Items.Any(x => x.Caption == e.Name))
{
var dirInfo = new DirectoryInfo(e.FullPath);
DirectoryInfoViewModel itemViewModel = new DirectoryInfoViewModel();
itemViewModel.Model = dirInfo;
Items.Add(itemViewModel);
}
}

public void OnFileDeleted(object sender, FileSystemEventArgs e)
{
System.Windows.Application.Current.Dispatcher.Invoke(() => OnFileDeleted(e));
}

private void OnFileDeleted(FileSystemEventArgs e)
{

Debug.WriteLine("File Deleted: " + e.Name);
if (Items.Any(x => x.Caption == e.Name))
{
var dirInfo = new DirectoryInfo(e.FullPath);
Debug.WriteLine("File path: " + e.FullPath);
DirectoryInfoViewModel itemViewModel = new DirectoryInfoViewModel();
itemViewModel.Model = dirInfo;
Items.Remove(itemViewModel);

}

}
public void OnFileRenamed(object sender, FileSystemEventArgs e)
{
System.Windows.Application.Current.Dispatcher.Invoke(() => OnFileRenamed(e));
}
private void OnFileRenamed(FileSystemEventArgs e)
{
Debug.WriteLine("File Renamed: " + e.Name);
OnFileDeleted(e);
OnFileCreated(e);

}
} }

private void OnFileDeleted(FileSystemEventArgs e)中,创建一个新的DirectoryInfoViewModel并尝试将其从Items集合中删除。如果T不提供替代相等检查,则ObservableCollection<T>.Remove(T)基于引用相等检查删除项。

因此,您尝试从中删除不在集合中的Items集合的项目。如果您检查Items.Remove(itemViewModel)的返回值,您会发现它返回false,因为在集合中没有找到与itemViewModel相等的项目(请参阅collection.Remove(T((。

这将通过找到你想删除的项目,然后删除它来解决问题。

private void OnFileDeleted(FileSystemEventArgs e)
{
if (Items.Any(x => x.Caption == e.Name))
{
var toDelete = Items.Single(x => x.Caption == e.Name);
Items.Remove(toDelete);
}
}

最新更新