2013-11-23 2 views
0

Я пытаюсь связать 2 строки из FileSystemWatcher (Name, FullPath), если файл создан.Не поддерживается Исключение при привязке

Я использую ObservableCollection и, возможно, я использую его неправильно.

Это то, что я пытался

private void StartFileMonitor() 
    { 
     var _monitorFolders = new List<string> { 
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).Replace("Roaming", string.Empty), 
      Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
     }; 

     try { 

      foreach (var folder in _monitorFolders) { 

       // Check if Folder Exists 
       if (Directory.Exists(folder)) { 

        FileSystemWatcher _fileSysWatcher = new FileSystemWatcher(); 

        _fileSysWatcher.Path = folder; 
        _fileSysWatcher.Filter = "*.*"; 

        // Created 
        _fileSysWatcher.Created += (sender, e) => { 

         _fileMonitorEntries.Add(new FileMonitor { 
          FileName = e.Name,  // Here is the Exception 
          FilePath = e.FullPath // 
         }); 
        }; 

        // Deleted 
        _fileSysWatcher.Deleted += (sender, e) => { 

         _fileMonitorEntries.Add(new FileMonitor { 
          FileName = e.Name, 
          FilePath = e.FullPath 
         }); 
        }; 

        _fileSysWatcher.EnableRaisingEvents = true; 
       } 
      } 

      lstFileMonitorEntries.ItemsSource = _fileMonitorEntries; 
     } 
     catch (Exception ex) { 
      MessageBox.Show(ex.Message); 
     } 
    } 

Вот XML код

  <ListBox Name="lstFileMonitorEntries" Height="358" Canvas.Left="292" Canvas.Top="10" Width="482" Background="#FF252222"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding FileName}" FontSize="15" FontFamily="Segeo WP Light" Foreground="White"/> 
          <TextBlock Text="{Binding FilePath}" FontSize="14" FontFamily="Segeo WP Light" Foreground="Red" /> 

         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 

Кто-нибудь есть идея о том, что я делаю неправильно?

+0

Как объявляется ваше обязательство? – Dan

+0

Вы понимаете, что вы потенциально добавляете те же файлы в коллекцию дважды? –

+0

Вы имеете в виду два обработчика событий и свойства? – iNCEPTION

ответ

0

Вы столкнулись с thread affinity issue здесь. ObservableCollection, связанный с элементом пользовательского интерфейса cannot be modified from other than UI thread.

И Created10 и Deleted события called on background thread и, следовательно, любые обновления в коллекции не допускаются из этой темы.

Вам необходимо delegate them on UI dispatcher, чтобы оно получило execute on UI thread. UI диспетчеру можно получить с помощью App.Current.Dispatcher Вот как это можно сделать -

_fileSysWatcher.Created += (sender, e) => 
     { 
      App.Current.Dispatcher.Invoke((Action)delegate 
      { 
       _fileMonitorEntries.Add(new FileMonitor 
       { 
       FileName = e.Name, 
       FilePath = e.FullPath 
       }); 
      }); 
     }; 

Аналогично делегировать код удаления события на UI диспетчером, а также.

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