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

时间:2015-06-19 21:47:52

标签: c# xaml filesystemwatcher ivalueconverter converters

我构建了一个转换器类,您可以在其中传入文件路径,并返回文件的实际文本。

   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\TST\820777\0010187775\69352C5D5C5D195.txt
                ]]>
            </TextBox.Text>
        </TextBox>
        <TextBox x:Name="FilePathRead_Txt" Text="{Binding ElementName=FilePath_Txt,Path=Text,Converter={StaticResource GetNotesFileFromPathConverter},Mode=OneWay}" />

这一切都很好。但是,如果文本文件中的文本已更新,则不会在XAML中反映出来。我已经看到有关使用FileSystemWatcher的信息,但我不确定如何在转换器中应用它以便更新返回的文本。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下我不会使用转换器,因为您需要在文件上设置FileSystemWatcher。我会将Text的FilePath_Txt绑定到视图模型中的属性,并将Text的FilePathRead_Txt绑定到另一个属性。然后,您将更新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}" />