WPF MVVM - 绑定(bind)仅适用于初始值

标签 wpf mvvm valueconverter

我正在开发基于 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 的内容转换为绑定(bind)到 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 属性绑定(bind)到另一个可以正常工作的文本框,这表明可能是 ValueConverter 导致了问题。我假设在某个地方我没有通知目标源属性的更改,但我无法弄清楚我哪里出错了。

非常感谢您的帮助。

最佳答案

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

为了获得您期望的行为,您需要绑定(bind)到它的内容而不是实际的元素(因为元素本身永远不会改变,只有它的内容会改变)。这实际上可能对 RichTextBox 有问题。控制,但有解决办法:见Richtextbox wpf binding .

关于WPF MVVM - 绑定(bind)仅适用于初始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757417/

相关文章:

wpf - (多个)MultiDataTrigger 与转换器的效率

c# - WPF XAML - DataTriggers 或 ValueConverters?最佳实践

c# - 使一些 DataGrid 单元格跨越多个列

c# - View 的创建应该是 View 或 ViewModel [MVVM] 的一部分?

c# - 将 xaml 文件及其关联的 xaml.cs 添加到 VS2010 项目中的步骤

c# - 将组合框数据从列表绑定(bind)到属性

wpf - 更多详细信息 - 当嵌套实现 INotifyPropertyChanged 的​​属性时,父对象必须传播更改吗?

c# - WPF 本地化 : DynamicResource with StringFormat?

wpf - 如何在 ControlTemplate 中使用 ElementName 绑定(bind)?

.net - 如何在 WPF DataGrid 中显示数组元素?