如何使用 FileSystemWatcher 刷新转换器返回的文本

How to use FileSystemWatcher to refresh text being returned from converter

我构建了一个转换器 class,您可以在其中传递文件路径,它 returns 是文件的实际文本。

   public class GetNotesFileFromPathConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
       var txtFilePath = (string)value;
       FileInfo txtFile = new FileInfo(txtFilePath);
       if (txtFile.Exists == false)
           {
               return String.Format(@"File not found");
           }
       try
       {
           return File.ReadAllText(txtFilePath);
       }

           catch (Exception ex){
               return String.Format("Error: " + ex.ToString());
           }
   }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    } 

转换器在 XAML:

中是这样应用的
        <TextBox x:Name="FilePath_Txt" >
            <TextBox.Text>  
                <![CDATA[
                \igtm.com\ART\GRAPHICS\TST0777[=11=]10187775352C5D5C5D195.txt
                ]]>
            </TextBox.Text>
        </TextBox>
        <TextBox x:Name="FilePathRead_Txt" Text="{Binding ElementName=FilePath_Txt,Path=Text,Converter={StaticResource GetNotesFileFromPathConverter},Mode=OneWay}" />

一切正常。但是,如果文本文件中的文本被更新,则不会反映在 XAML 中。我看过有关使用 FileSystemWatcher 的信息,但不确定如何在转换器内部应用它以便更新返回的文本。谁能帮忙?

在这种情况下我不会使用转换器,因为您需要在文件上设置 FileSystemWatcher。我会将 FilePath_Txt 的 Text 绑定到视图模型中的 属性,并将 FilePathRead_Txt 的 Text 绑定到另一个 属性。然后,您将更新 FileSystemWatcher 以查找对此新文件的更新。如果文件名更改或文件已更新,那么您将使用转换器中的逻辑来更新 FilePathRead_Txt 属性。如果您不熟悉 MVVM 模式,请查看此 MSDN article.

在您的视图模型中:

string filename;
public string Filename
{
   get {return filename;}
   set {
      if (filename != value)
      {
         filename = value;
         OnNotifyPropertyChanged("Filename");
         WatchFile();
         UpdateFileText();
      }
}

string fileText;
public string FileText
{
   get {return fileText;}
   set {
      fileText = value;
      OnNotifyPropertyChanged("FileText");
   }
}

private void WatchFile()
{
   // Create FileSystemWatcher on filename
   // Call UpdateFileText when file is changed
}

private void UpdateFileText()
{
   // Code from your converter
   // Set FileText
}

在XAML中:

<TextBox x:Name="FilePath_Txt" Text="{Binding Filename, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox x:Name="FilePathRead_Txt" Text="{Binding FileText}" />