我遇到RichTextBox
的问题,我想将文档内容保存在文本文件中。为此,我使用下一个代码:
XAML
<RichTextBox Grid.Row="0" x:Name="myRichTextBox" AcceptsTab="True" Margin="20">
<FlowDocument>
<Paragraph>
<Run>Some Paragraph</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
Code
private void btnSaveToTxt_Click(object sender, RoutedEventArgs e)
{
string fileName = @"D:\testRichTextBox1Text.txt";
SaveToTextFile(fileName);
MessageBox.Show("Text File Saved");
}
public void SaveToTextFile(string fileName)
{
TextRange range;
FileStream fileStream;
range = new TextRange(myRichTextBox.Document.ContentStart,
myRichTextBox.Document.ContentEnd);
fileStream = new FileStream(fileName, FileMode.Create);
range.Save(fileStream, DataFormats.Text);
fileStream.Close();
}
这段代码很好,但是它有效,但我如何使用MVVM
执行此操作。对于这种方法,我需要RichTextBox的x:Name =“myRichTextBox”属性。
我想绑定一个ICommand
来调用SaveToTextFile()
方法,但如果没有RichTextBox的Name属性,它就无法工作。
有没有办法用MVVM做到这一点? 谢谢!
答案 0 :(得分:4)
viewmodel不需要Name属性。要保存文档,只需要FlowDocument对象。因此,为Save操作创建一个命令,并通过CommandParameter传递FlowDocument实例。
public class ViewModel
{
string fileName = @"D:\testRichTextBox1Text.txt";
private ICommand saveCommand;
public ICommand SaveCommand
{
get
{
if (saveCommand == null)
{
saveCommand = new DelegateCommand(SaveToTextFile);
}
return saveCommand;
}
}
public void SaveToTextFile(object document)
{
TextRange range;
FileStream fileStream;
range = new TextRange(((FlowDocument)document).ContentStart,
((FlowDocument)document).ContentEnd);
fileStream = new FileStream(fileName, FileMode.Create);
range.Save(fileStream, DataFormats.Text);
fileStream.Close();
MessageBox.Show("Text File Saved");
}
}
XAML如下所示,
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Button Content="Save" Margin="20 10" Command="{Binding SaveCommand}" CommandParameter="{Binding ElementName=myRichTextBox, Path=Document}"/>
<RichTextBox Grid.Row="1" x:Name="myRichTextBox" AcceptsTab="True" Margin="20">
<FlowDocument>
<Paragraph>
<Run>Some Paragraph</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
</Grid>