0

我正在开发基于 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 导致了问题。我假设在某个地方我没有通知目标源属性的更改,但我无法弄清楚我哪里出错了。

非常感谢您的帮助。

4

3 回答 3

2

您正在绑定到元素HtmlRichTextBox,而不是它的内容。由于该元素永远不会更改为不同的实例,因此它永远不会更新,并且您的转换器永远不会被调用。

为了获得您期望的行为,您需要绑定到它的内容而不是实际的元素(因为元素本身永远不会改变,只有它的内容会改变)。这实际上可能是RichTextBox控件的问题,但有一些解决方案:请参阅Richtextbox wpf binding

于 2013-02-07T17:49:28.233 回答
2

你的绑定是对RichTextBox自身的,它永远不会改变。您需要绑定到更改应触发绑定更新的事物。

于 2013-02-07T17:50:02.527 回答
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 的文本框的名称。我希望它可以帮助你。

于 2013-02-07T18:19:52.353 回答