我正在研究基于MVVM模式的WPF应用程序。
我有一个RichTextBox,如下所示:
<RichTextBox Name="HtmlRichTextBox">
<FlowDocument>
<Paragraph>
Some Test
</Paragraph>
</FlowDocument>
</RichTextBox>
和TextBox:
<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
问题是,首次加载View时,TextBox Text属性设置正确,但对RichTextBox内容的任何后续更改都不会更新TextBox。
如果我使用一个简单的例子,我将一个TextBox的Text属性绑定到另一个TextBox的工作正常,这表明可能是ValueConverter导致了问题。我假设在某个地方,我没有通知目标对源属性的更改,但我无法解决我出错的地方。
非常感谢您的帮助。
答案 0 :(得分:2)
您绑定到元素HtmlRichTextBox
,而不是它的内容。由于该元素永远不会更改为其他实例,因此它永远不会更新,并且永远不会调用转换器。
为了获得您期望的行为,您需要绑定到其内容而不是实际元素(因为元素本身永远不会更改,只有其内容是)。使用RichTextBox
控件实际上可能存在问题,但有解决方案:请参阅Richtextbox wpf binding。
答案 1 :(得分:2)
您的绑定是RichTextBox
本身,它永远不会改变。您需要绑定到更改应触发绑定更新的事物。
答案 2 :(得分:1)
您可以按照原来的需要使用它。它只需要明确更新。我与你分享我的实施。我尝试了它,它的工作原理。抱歉,我是在C#而不是在VB中完成的。
XAML:
<RichTextBox Name="HtmlRichTextBox" TextChanged="HtmlRichTextBox_OnTextChanged">
代码隐藏中的事件处理程序:
if (this.MyTextBox != null)
{
BindingExpression bindingExpr = this.MyTextBox.GetBindingExpression(TextBox.TextProperty);
bindingExpr.UpdateTarget();
}
MyTextBox是文本框的名称,它绑定到RichTextBox。 我希望它可以帮助你。