我构建了一个转换器类,您可以在其中传入文件路径,并返回文件的实际文本。
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的信息,但我不确定如何在转换器中应用它以便更新返回的文本。有人可以帮忙吗?
答案 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}" />