2013-02-07 27 views
0

我正在基於MVVM模式的WPF應用程序。WPF MVVM - 綁定僅適用於初始值

我有一個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 

的問題是,文本框的文本屬性設置正確,第一次加載時查看,但隨後的RichTextBox的內容進行任何更改不會更新文本框。

如果我使用一個簡單的例子,我將一個TextBox的Text屬性綁定到另一個工作正常,這表明它可能是ValueConverter,它是問題的原因。我假設沿線的某個地方我沒有通知源項目變更的目標,但我無法弄清楚我出錯的地方。

非常感謝您的幫助。

回答

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的名稱。 我希望它能幫助你。

+0

感謝肯特和菲利普指出我的錯誤(現在看起來很明顯!)。我不是100%滿意地手動更新綁定,但由於時間壓力,這是我現在要做的,所以謝謝。 –

2

您綁定到元素HtmlRichTextBox,而不是它的內容。由於該元素永遠不會更改爲不同的實例,因此永遠不會更新,並且您的轉換器永遠不會被調用。

爲了獲得您期望的行爲,您需要綁定到其內容而不是實際元素(因爲元素本身不會更改,只有其內容)。這實際上可能是RichTextBox控制有問題,但有解決方案:請參閱Richtextbox wpf binding

2

你的約束力是RichTextBox本身,它永遠不會改變。您需要綁定更改應該觸發綁定更新的事物。