手动修改或清除文本时,RichTextBox绑定会中断

问题描述 投票:0回答:2

我有一个RichTextBox绑定到一个字符串。

使用C#I生成一个写入它的字符串。

但是如果我想通过单击RichTextBox手动更改文本并使用退格键删除它,或者按Enter键以创建一个新行,则绑定会被破坏,我再也无法以编程方式再次使用该字符串写入。


XAML

<RichTextBox x:Name="rtbScriptView" 
             Margin="11,71,280,56" 
             Padding="10,10,10,48"
             FontSize="14" 
             Grid.ColumnSpan="1" 
             VerticalScrollBarVisibility="Auto" 
             RenderOptions.ClearTypeHint="Enabled"
             Style="{DynamicResource RichTextBoxStyle}">
    <FlowDocument>
        <Paragraph>
            <Run Text="{Binding ScriptView_Text, 
                                Mode=TwoWay, 
                                UpdateSourceTrigger=PropertyChanged}" />
        </Paragraph>
    </FlowDocument>
</RichTextBox>

查看模型

private string _ScriptView_Text;
public string ScriptView_Text
{
    get { return _ScriptView_Text; }
    set
    {
        if (_ScriptView_Text == value)
        {
            return;
        }

        _ScriptView_Text = value;
        OnPropertyChanged("ScriptView_Text");
    }
}

C#

ViewModel vm = new ViewModel();
DataContext = vm;

// Display a string in the RichTextBox

vm.ScriptView_Text = "This is a test."; // <-- This won't work if text is manually modified
c# wpf xaml mvvm richtextbox
2个回答
0
投票

为什么你要写这一行。请检查后删除行。

if (_ScriptView_Text == value)
{
   return;
}

0
投票

编辑RichTextBox时,可以更改FlowDocument元素内的元素。您有绑定的元素可能在此编辑过程中的某些时候被删除。查看RichtTextBox.Document.Groups以查看编辑RichTextBox时发生的情况。

默认的RichTextBox并不能真正支持MVVM / Binding。您希望对Document属性具有绑定,但默认的RichTextBox不支持此属性。你可以看看here

或者自己扩展,像这样?:

可绑定的RichTextBox类

public class BindableRichTextBox : RichTextBox
{
    public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register(nameof(Document), typeof(FlowDocument), typeof(BindableRichTextBox), new FrameworkPropertyMetadata(null, OnDocumentChanged));

    public new FlowDocument Document
    {
        get => (FlowDocument)GetValue(DocumentProperty);
        set => SetValue(DocumentProperty, value);
    }

    public static void OnDocumentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        var rtb = (RichTextBox)obj;
        rtb.Document = args.NewValue != null ? (FlowDocument)args.NewValue : new FlowDocument();
    }   
}

XAML

<controls:BindableRichTextBox Document="{Binding YourFlowDocumentObject, Mode=OneWay}"/>

然后,您可以从FlowDocument中获取字符串。

© www.soinside.com 2019 - 2024. All rights reserved.