如何使用 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}" />
我构建了一个转换器 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}" />