0

私は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

問題は、ビューが最初にロードされたときにTextBox Textプロパティが正しく設定されているが、RichTextBoxのコンテンツに対するその後の変更によってTextBoxが更新されないことです。

あるTextBoxのTextプロパティを別のTextBoxにバインドする簡単な例を使用すると、問題の原因はおそらく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

本来の思い通りに使えます。明示的に更新する必要があるだけです。私の実装をあなたと共有します。私はそれを試してみましたが、うまくいきました。申し訳ありませんが、VB ではなく C# で作成しました。

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 に答える