2011-08-09 95 views
4

由於標題已經說過,我在使用數據綁定和DependencyProperty時遇到了問題。我有一個類叫做HTMLBox:WPF依賴屬性 - 數據綁定不起作用

public class HTMLBox : RichTextBox 
{ 
    public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(HTMLBox)); 

    public string Text 
    { 
     get 
     { 
      return GetValue(TextProperty) as string; 
     } 
     set 
     { 
      Console.WriteLine("Setter..."); 
      SetValue(TextProperty, value); 
     } 
    } 

    public HTMLBox() 
    { 
     // Create a FlowDocument 
     FlowDocument mcFlowDoc = new FlowDocument(); 

     // Create a paragraph with text 
     Paragraph para = new Paragraph(); 
     para.Inlines.Add(new Bold(new Run(Text))); 

     // Add the paragraph to blocks of paragraph 
     mcFlowDoc.Blocks.Add(para); 

     this.Document = mcFlowDoc; 
    } 
} 

我閱讀的文本屬性在構造函數,所以當一個字符串被綁定到的屬性應該顯示爲文本。但即使我將某些數據綁定到xaml中的T​​ext屬性,我甚至不會看到「Setter ...」 - 設置Text屬性時應顯示的消息。

<local:HTMLBox Text="{Binding Text}" 
      Width="{Binding Width}" 
      AcceptsReturn="True" 
      Height="{Binding Height}" /> 

如果我將HTMLBox更改爲TextBox,文本顯示正常,所以錯誤可能是我的HTMLBox類中的somwhere。我究竟做錯了什麼?

回答

4

你必須要對一些問題在這裏:

  1. 你不應該把邏輯在設置/獲取它包裝你的依賴屬性的CLR屬性。此屬性僅用於提供更方便的機制來獲取/設置依賴項屬性。不能保證XAML解析器會調用這個setter。如果您在依賴項屬性更改時需要調用任何邏輯,請在通過DependencyProperty.Register註冊依賴項屬性時通過更改事件處理程序執行此操作。
  2. 您在構造函數中構建控件的用戶界面,這裏您有時間問題!要構造類的實例,首先調用構造函數,然後設置各種屬性。 Text將始終是構造函數中的默認值。再次,類似的解決方案(1),當你的Text屬性發生變化時,重建/更新你的UI。
+0

謝謝,使用改變事件處理程序解決了這個問題。看起來像我有很多東西要學習:) – BoltzmannBrain