2016-07-09 24 views
3

Ich wünsche die Temp-Dateien im WPF XAML zur Liste Verwendung von MVVM Bindung mit INotifyPropertyChanged.Bind-System bezogenen Informationen in WPF mit INotifyPropertyChanged

The View Modell ist TempViewModel.cs

class TempViewModel : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    public List<FileInfo> CacheFiles 
    { 
     get 
     { 
      string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); 
      System.IO.DirectoryInfo di = new DirectoryInfo(path); 
      return di.GetFiles().ToList(); 
     } 
    } 
} 

Die Dateien im Temp-Ordner auf Zeit zu Zeit variieren. Ich brauche es automatisch zu aktualisieren, wenn die Dateien in dem Ordner Temp aktualisiert mit INotifyPropertyChanged in dem XAML-UI

Wie kann ich binde es in der xMAL?

MainWindow.xaml

<Window x:Class="Binding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListBox Name="LstProduct" ItemsSource="{Binding CacheFiles}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=FullName}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Window> 

MainWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += new RoutedEventHandler(MainWindow_Loaded); 
    } 

    void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.DataContext = new TempViewModel(); 
    } 
} 

ich nicht in der Lage können die aktualisierte Filename-Liste in der Benutzeroberfläche zu erhalten. Bitte helfen Sie mir, wie Sie die Benutzeroberfläche aktualisieren, wenn die Dateien im Temp-Ordner hinzugefügt oder gelöscht werden?

Antwort

1

Die Antwort FileSystemWatcher

ist, sollten Sie ändern Ihre TempViewModel.cs

class Cleaner : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    private List<KeyValuePair<string, ulong>> _memoryPool = new List<KeyValuePair<string, ulong>>(); 
    public List<KeyValuePair<string, ulong>> MemoryPool 
    { 
     get { return _memoryPool; } 
     set 
     { 
      _memoryPool = value; 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("MemoryPool")); 
     } 
    } 


    private void watch() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); 
     watcher.NotifyFilter = NotifyFilters.LastWrite; 
     watcher.Filter = "*.*"; 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.EnableRaisingEvents = true; 
    } 

    private void OnChanged(object source, FileSystemEventArgs e) 
    { 
     UpdateCollection(); 
    } 

    private void UpdateCollection() 
    { 
     string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);; 
     System.IO.DirectoryInfo di = new DirectoryInfo(path); 
     CacheFiles = di.GetFiles().ToList(); 
    } 

    public Cleaner() 
    { 
     UpdateCollection(); 
     watch(); 
    } 
} 
1

Verwenden Sie eine FileSystemWatcher (see the docs for how to use it) und abonnieren Sie eines ihrer Ereignisse. Rufen Sie in diesem Handler das PropertyChanged-Ereignis mit "CacheFiles" auf, um der UI zu signalisieren, die Eigenschaft CacheFiles erneut zu erhalten.

Sie können sicherlich mit einem ObservableCollection verbessern und Einträge manuell hinzufügen/entfernen, aber die Art und Weise, die ich beschrieben, sollte funktionieren.

+0

können Sie bitte erläutern Sie es bitte in Bezug auf den Code? –

+0

innerhalb von zwei Minuten haben Sie zwei sehr ähnliche Antworten. Dies legt nahe, dass dies nicht sehr schwierig ist. Ich werde den ganzen Code nicht liefern. Ich schlage vor, Sie lesen auf der 'INotifyCollectionChanged'-Schnittstelle und versuchen es dann selbst! –

1

Sie sollten FileSystemWatcher und Changed event verwenden. Wenn zum Beispiel Filesystemwatcher Changed-Ereignis auslösen, sollten Sie Ereignishandler Cachefile Eigenschaft ändern mit Property Anhebung

+0

können Sie es bitte bitte in Bezug auf den Code ausarbeiten? –