我有一个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
为什么你要写这一行。请检查后删除行。
if (_ScriptView_Text == value)
{
return;
}
编辑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中获取字符串。