2016-07-09 6 views
3

Я хочу, чтобы список из Temp файлы в WPF XAML с использованием MVVM Связывание с INotifyPropertyChanged.Bind системы информация, связанная в WPF с помощью INotifyPropertyChanged

The View Model является 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(); 
     } 
    } 
} 

файлы в папке Temp может изменяться в зависимости время от времени. Мне нужно обновить его автоматически, когда файлы обновляются в папке Temp, используя INotifyPropertyChanged в XAML UI

Как я мог связать его в 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(); 
    } 
} 

Я не в состоянии получить обновленный список FileName в пользовательском интерфейсе. Пожалуйста, помогите мне, как обновлять пользовательский интерфейс, когда файлы добавляются или удаляются в папке Temp?

ответ

1

Ответ FileSystemWatcher

Вы должны изменить ваши 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

Используйте FileSystemWatcher (see the docs for how to use it) и подпишитесь на одно из своих событий. В этом обработчике вызовите событие PropertyChanged с "CacheFiles", чтобы сигнализировать пользовательскому интерфейсу, чтобы снова получить свойство CacheFiles.

Вы можете улучшить это с помощью ObservableCollection и вручную добавлять/удалять записи, но способ, которым я описывал, должен работать.

+0

может вас любезно продумайте его, пожалуйста, с точки зрения кода? –

+0

в течение двух минут у вас есть два _very_ похожих ответа. Это говорит о том, что это не очень сложно сделать. Я не буду поставлять весь код. Я предлагаю вам ознакомиться с интерфейсом «INotifyCollectionChanged», а затем попробовать сами! –

1

Вы должны использовать FileSystemWatcher и Changed event. Например, когда FileSystemWatcher поднять Changed события, вы обработчик событий следует изменить CacheFile свойство с повышением PropertyChanged

+0

можете ли вы любезно продумать его, пожалуйста, с точки зрения кода? –