2015-08-26 3 views
2

Я создаю простое приложение, в котором оно отображает все файлы определенного формата в одном списке. Я разделил программу на класс «DataFiles», где я устанавливаю FileSystemWatcher, если что-то там меняется. Если что-то изменится, я хочу обновить свой список, который помещается в MainWindows.xaml.Update ListView, когда обновления из другого класса

Итак, у меня есть мои MainWindowViewModel.cs и DataFiles.cs и ListView в MainWindow.xaml. Как обновить List из DataFiles до MainWindow.xaml?

Мой DataFiles класс, если что-то помогает:

public FileSystemWatcher filewatcher; 
    public string ConfigurationFilesSourcePath; 
    public ObservableCollection<Files> fileslist { get; protected set; } = new ObservableCollection<Files>(); 

    public void InitializeFiles() 
    { 
     // Create a new FileSystemWatcher 
     filewatcher = new FileSystemWatcher(); 

     // Set filter 
     filewatcher.Filter = "*.txt"; 

     // Set the path 
     filewatcher.Path = ConfigurationFilesSourcePath; 

     // Subscribe to the Created event 
     filewatcher.Created += new FileSystemEventHandler(FileOnchanged); 
     filewatcher.Changed += new FileSystemEventHandler(FileOnchanged); 
     filewatcher.Deleted += new FileSystemEventHandler(FileOnchanged); 
     filewatcher.Renamed += new RenamedEventHandler(FileOnRenamed); 

     // Enable the FileSystemWatcher events 
     filewatcher.EnableRaisingEvents = true; 

     RefreshFilesList(); 
    } 

    private void FileOnchanged(object sender, FileSystemEventArgs e) 
    { 
     RefreshFilesList(); 
    } 

    private void FileOnRenamed(object sender, RenamedEventArgs e) 
    { 
     RefreshFilesList(); 
    } 

    public void RefreshFilesList() 
    { 
     fileslist.Clear(); 

     //string[] getfiles = Directory.GetFiles(FolderLocation); 
     DirectoryInfo dir = new DirectoryInfo(ConfigurationFilesSourcePath); 

     string[] extensions = new[] { ".txt" }; 

     int nof = 0; 
     foreach (FileInfo file in dir.GetFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray()) 
     { 
      nof++; 

      fileslist.Add(new Files() 
      { 
       FileId = nof, 
       FileName = file.Name, 
       FileChanged = file.LastWriteTime.ToString(), 
       FileCreated = file.CreationTime.ToString(), 
       OnlyNameWithoutExtension = Path.GetFileNameWithoutExtension(file.Name) 
      }); 
     } 

     NotifyPropertyChanged("fileslist"); 
    } 

Если вы считаете, что я должен быть довольно новое в WPF, вы правы :) Так что извините, если это глупый вопрос. Пожалуйста, за помощью.

XAML:

<ListView Name="lvfiles" Grid.Row="4" ItemsSource="{Binding fileslist}" SelectionMode="Single" SelectedItem="{Binding SelectedFiles}" DataContext="{Binding }" Style="{StaticResource ListView}"> 
         <ListView.View> 
          <GridView x:Name="gridFiles"> 
           <GridViewColumn> 
            <GridViewColumn.CellTemplate> 
             <DataTemplate> 
              <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/> 
             </DataTemplate> 
            </GridViewColumn.CellTemplate> 
           </GridViewColumn> 
           <GridViewColumn x:Name="FileId" Header="#" DisplayMemberBinding="{Binding FileId}" Width="Auto"/> 

           <GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" Width="Auto"> 
            <GridViewColumn.CellTemplate> 
             <DataTemplate> 
              <TextBox Text="{Binding FileName, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" BorderThickness="0" Style="{StaticResource ListViewTextBoxes}"/> 
             </DataTemplate> 
            </GridViewColumn.CellTemplate> 
           </GridViewColumn> 

           <!--<GridViewColumn x:Name="FileName" Header="{inf:Loc ConfigurationsName}" DisplayMemberBinding="{Binding FileName}" Width="Auto"/>--> 
           <GridViewColumn x:Name="FileCreated" Header="{inf:Loc ConfigurationsCreated}" DisplayMemberBinding="{Binding FileCreated}" Width="Auto"/> 
           <GridViewColumn x:Name="FileChanged" Header="{inf:Loc ConfigurationsChanged}" DisplayMemberBinding="{Binding FileChanged}" Width="Auto"/> 
          </GridView> 
         </ListView.View> 
        </ListView> 
+0

вы также должны предоставить свой XAML. вы использовали привязку? – RazorEater

+0

Да. Я обновляю сообщение (извините) – esispaned

ответ

1

В MainMenu вы должны назначить обработчик события PropertyChanged и внутри нее вы можете обновить список.

DataDiles.PropertyChanged+= DataFiles_PropertyChanged; 

public void DataFiles_PropertyChanged(/*...*/) 
{ 
    //Refresh the list 
} 

Для более точного кода, пожалуйста, внесите изменения в свой вопрос и полностью добавьте определение своего класса DataFiles.
Надеюсь, это поможет.

+0

Спасибо! Теперь его работа;) – esispaned

+0

@esispaned Спасибо за внимание. –

+0

@esispaned без проблем мой друг. отправьте мне первую строку вашего класса DataFiles. Я разрешу это. –

1

Связывание ItemsSource с ObservableCollection автоматически синхронизирует представление списка с коллекцией для каждой коллекции.Add/Remove/Clear метод call. Поэтому я бы не рекомендовал полностью переделать коллекцию для каждого события filewatcher. (Если у вас было добавлено 99 файлов и 1 файл, вы получили бы 1 событие с изменением коллекции для вызова Clear и 100 событий для вызовов 100 Add Add.) Вместо этого вы могли бы попытаться перенести изменения, описанные в событиях файлового ввода, точно на изменения коллекции : filewatcher.Created -> collection.Add; filewatcher.Deleted -> collection.Remove; filewatcher.Renamed -> collection.Remove + collection.Add. Но если файловый менеджер пропускает файл, который создается/удаляется, ваш список не будет реализовывать изменения. (На самом деле я бы не доверять FileWatcher, что далеко.)

или (проще) не использовать ObservableCollection, но только ArrayList как тип вашей FilesList собственности. Если во время звонков и Add не возникает никаких событий, вы запускаете синхронизацию ListView, вызывая NotifyPropertyChanged("fileslist") один раз в конце RefreshFilesList, как вы уже это делали.

Убедитесь, что DataFiles класс реализует INotifyPropertyChanged и что DataContext из ваших ListView является DataFiles экземпляр (идеально расположен в собственность в вашей модели представления).

+0

Я не ожидал более 10 файлов, так что это не проблема для меня. Спасибо, в любом случае. – esispaned

Смежные вопросы