Cómo enlazar una colección a un ListView en WPF

Tengo un progtwig que busca en un directorio archivos que cumplan ciertos criterios. Este proceso de búsqueda lleva mucho tiempo, así que tengo que llamarlo de forma asíncrona. Cuando el algoritmo de búsqueda encuentra un archivo, activa un evento. Mi instancia de MainWindow escucha este evento y necesita actualizar la GUI. ¿Cómo puedo enlazar estos archivos “agregados” a un ListView ? Pensé que podría usar una instancia de ObservableCollection , pero no puedo averiguar cómo enlazarla.

He eliminado todos los controles y códigos irrelevantes. Aquí están los dos archivos relevantes.

MainWindow.xaml:

             

MainWindow.xaml.cs:

 using System.IO; using System.Threading.Tasks; public partial class MainWindow { private SearchLogic _backgroundSearch; private async void Search(object sender, RoutedEventArgs e) { // TODO: clear Results _backgroundSearch = new SearchLogic("", new DirectoryInfo("C:\")); _backgroundSearch.FileAdded += FileAdded; await Task.Run(new Action(_backgroundSearch.Search)); } private void FileAdded(object sender, FileAddedEventArgs eventArgs) { // TODO: add eventArgs.File to Results // eventArgs.File is an instance of FileInfo } } 

Aquí hay un ejemplo simple.

Tu XAML

                 

Tu código detrás

 public partial class MainWindow : Window { public class FileInfo { public string Name { get; set; } public DateTime LastModified { get; set; } public FileInfo(string name) { Name = name; LastModified = DateTime.Now; } } ObservableCollection mFileNames = new ObservableCollection(); public ObservableCollection FileNames { get { return mFileNames; } } public MainWindow() { DataContext = this; InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { ThreadPool.QueueUserWorkItem((x) => { while (true) { Dispatcher.BeginInvoke((Action)(() => { mFileNames.Add(new FileInfo("X")); })); Thread.Sleep(500); } }); } } 

Si ejecuta este problema, notará que el cuadro de lista se actualiza cada medio segundo con un nuevo elemento. Básicamente, la clave a tener en cuenta es que ObservableCollection solo se puede actualizar desde el subproceso de la interfaz de usuario, por lo que si necesita refactorizar el código anterior, deberá utilizar el Distribuidor del subproceso de la interfaz de usuario actual para actualizarlo.