我正在开发一个基于MVVM模式的WPF应用程序。
我有一个RichTextBox,就像这样:
<RichTextBox Name="HtmlRichTextBox">
<FlowDocument>
<Paragraph>
Some Test
</Paragraph>
</FlowDocument>
</RichTextBox>
和一个文本框:
<TextBox Text="{Binding ElementName=HtmlRichTextBox, Converter={StaticResource ResourceKey=RichTextBoxContentConverter}, Mode=OneWay}"/>
眼尖的人会注意到,我正在使用ValueConverter将RichTextBox的内容转换为绑定到TextBox的text属性的文本。ValueConverter的代码在这里:
<ValueConversion(GetType(RichTextBox), GetType(String))> _
Public Class RichTextBoxContentConverter : Implements IValueConverter
Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
Dim returnValue As String = String.Empty
If TryCast(value, RichTextBox) IsNot Nothing Then
Dim rtb As RichTextBox = CType(value, RichTextBox)
Dim rtbTextRange As New TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)
If Not rtbTextRange.IsEmpty Then returnValue = rtbTextRange.Text
End If
Return returnValue
End Function
Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
Throw New NotImplementedException()
End Function
End Class
问题是,当第一次加载视图时,TextBox Text属性设置正确,但对RichTextBox内容的任何后续更改都不会更新TextBox。
如果我使用一个简单的例子,将一个TextBox的Text属性绑定到另一个,效果很好,这表明问题的原因可能是ValueConverter。我假设在这条线上的某个地方,我没有通知目标源属性的更改,但我无法确定哪里出了问题。
非常感谢您的帮助。
您绑定到的是元素HtmlRichTextBox
,而不是它的内容。由于该元素永远不会更改为不同的实例,因此它永远不会更新,也永远不会调用转换器。
为了获得您期望的行为,您需要绑定到其内容,而不是实际元素(因为元素本身永远不会改变,只有其内容会改变)。RichTextBox
控件实际上可能存在问题,但有一些解决方案:请参阅Richtextbox-wpf绑定。
您可以按照最初的意愿使用它。它只需要显式更新即可。我将与您分享我的实施方案。我试过了,效果很好。对不起,我是用C#做的,不是用VB.做的
XAML:
<RichTextBox Name="HtmlRichTextBox" TextChanged="HtmlRichTextBox_OnTextChanged">
代码背后的事件处理程序:
if (this.MyTextBox != null)
{
BindingExpression bindingExpr = this.MyTextBox.GetBindingExpression(TextBox.TextProperty);
bindingExpr.UpdateTarget();
}
MyTextBox是绑定到RichTextBox的文本框的名称。我希望它能帮助你。
您的绑定是到RichTextBox
本身的,它永远不会改变。您需要绑定到更改应该触发绑定更新的对象。