2015-08-26 117 views
2

我正在構建簡單的應用程序,它顯示在一個列表視圖中的某些格式的所有文件。我已經將程序分爲「DataFiles」類,如果在那裏發生了某些變化,我會在其中創建FileSystemWatcher。如果有什麼改變,那麼我想更新放置在MainWindows.xaml中的Listview。更新列表視圖當從另一個類更新

所以我有MainWindow.xaml中的MainWindowViewModel.cs和DataFiles.cs和ListView。如何從DataFiles更新列表到MainWindow.xaml?

我的數據文件類,如果事情可以幫助:

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

ItemsSourceObservableCollection的綁定自動將listview與每個collection的集合同步.Add/Remove/Clear方法調用。所以我不建議完全重新制作每個filewatcher事件的集合。 (如果您添加了99個文件和1個文件,您將爲清除調用獲取1個收集更改事件,併爲100個添加調用獲得100個事件。)您可以嘗試將由filewatcher事件描述的更改完全轉移到收集更改:filewatcher.Created - > collection.Add; filewatcher.Deleted - > collection.Remove; filewatcher.Renamed - > collection.Remove + collection.Add。但是,如果filewatcher錯過了正在創建/刪除的文件,則您的列表將無法實現更改。 (其實我也不會相信filewatcher那麼遠。)

或(容易)你不使用ObservableCollection只是ArrayList類型的FilesList財產。在ClearAdd調用期間沒有發生任何事件,您可以像RefreshFilesList那樣通過調用NotifyPropertyChanged("fileslist")來觸發ListView的同步。

要確保DataFiles類實現INotifyPropertyChanged和你ListViewDataContextDataFiles實例(理想地坐落在您的視圖模型屬性)。

+0

我不希望超過10個文件,所以這對我來說不是問題。不管怎麼說,還是要謝謝你。 – esispaned