我有一个问题,RichTextBox
我想将文档的内容保存在一个文本文件中。为此,我使用下一个代码:
XAML
<RichTextBox Grid.Row="0" x:Name="myRichTextBox" AcceptsTab="True" Margin="20">
<FlowDocument>
<Paragraph>
<Run>Some Paragraph</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
这段代码是好的,它可以工作,但是我将如何使用MVVM
. 对于这种方法,我需要 RichTextBox 的 x:Name="myRichTextBox" 属性。我想绑定一个ICommand
to invokeSaveToTextFile()
方法,但是如果没有 RichTextBox 的 Name 属性,它就无法工作。
有没有办法用 MVVM 做到这一点?谢谢!
视图模型不需要 Name 属性。要保存文档,它只需要 FlowDocument 对象。所以创建一个用于保存操作的命令,并通过 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");
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)