使用MVVM保存RichTextBox's的内容到文件

本文关键字:文件 保存 MVVM RichTextBox 使用 | 更新日期: 2023-09-27 18:16:00

我有一个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它不会工作。

是否有办法做到这一点与MVVM ?谢谢!

使用MVVM保存RichTextBox's的内容到文件

视图模型不需要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");
    }
}

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>