【问题标题】:WPF MVVM - Binding only working for the initial valueWPF MVVM - 绑定仅适用于初始值
【发布时间】:2013-02-07 17:37:47
【问题描述】:

我正在开发一个基于 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

问题是第一次加载 View 时 TextBox Text 属性设置正确,但随后对 RichTextBox 内容的任何更改都不会更新 TextBox。

如果我使用一个简单的示例,将一个 TextBox 的 Text 属性绑定到另一个可以正常工作的文本框,这表明可能是 ValueConverter 导致了问题。我假设在某个地方我没有通知目标源属性的更改,但我无法弄清楚我哪里出错了。

非常感谢您的帮助。

【问题讨论】:

    标签: wpf mvvm valueconverter


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可以按照自己的意愿使用它。它只需要显式更新。我与您分享我的实现。我试过了,它奏效了。抱歉,我是在 C# 中而不是在 VB 中完成的。

        XAML:

            <RichTextBox Name="HtmlRichTextBox" TextChanged="HtmlRichTextBox_OnTextChanged">
        

        代码隐藏中的事件处理程序:

                if (this.MyTextBox != null)
                {
                    BindingExpression bindingExpr = this.MyTextBox.GetBindingExpression(TextBox.TextProperty);
                    bindingExpr.UpdateTarget();
                }
        

        MyTextBox 是绑定到 RichTextBox 的文本框的名称。 希望对你有帮助。

        【讨论】:

        • 感谢 Kent 和 Philip 指出我的错误(现在看起来很明显!)。我对手动更新绑定不是 100% 满意,但由于时间压力,这就是我现在要做的,所以谢谢。
        猜你喜欢
        • 2015-06-30
        • 2014-08-27
        • 2012-05-04
        • 2011-08-17
        • 2023-03-27
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多