title: Silverlight dependency property snafu, what am I doing wrong?
body: <p>I'm enhancing an open source control to add some functionality that I need, and I'm getting hopelessly tangled up in the following problem:</p>
  
  <p>The control is a rich textbox that supports HTML but not via a property; you have to do something like this:</p>
  
  <pre><code>var sHtml = "..."
  ctrl.LoadHtml(sHtml)
  </code></pre>
  
  <p>and</p>
  
  <pre><code>var sHtml = ctrl.SaveHtml()
  </code></pre>
  
  <p>So far so good.  But I want to set the HTML via data binding, so I made a dependency property called Html:</p>
  
  <pre><code>    public static readonly DependencyProperty HtmlProperty =
          DependencyProperty.Register(
              "Html",
              typeof(string),
              typeof(RichTextEditor),
              new PropertyMetadata(string.Empty, new PropertyChangedCallback(HtmlChangedCallback))
              );
  
      public string Html
      {
          get {return (string)GetValue(HtmlProperty);}
  
          set {SetValue(HtmlProperty, value);}
      }
  
      private static void HtmlChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
      {
          //get the control
          var rte = (RichTextEditor)d;
  
          //got here, so load the html
          rte.TextBox.LoadHtml((string)e.NewValue);
      }
  </code></pre>
  
  <p>This all works fine.  The problem I'm having is that I can't figure out how to notify the property system when the contents of the control have changed.  The control has a ContentChanged event, so I tried this:</p>
  
  <pre><code>    private void rtb_ContentChanged(object sender, RichTextBoxEventArgs e)
      {
          //tell the html prop that it changed
          SetValue(HtmlProperty, rtb.SaveHtml());
      }
  </code></pre>
  
  <p>But this then triggers the HtmlChangedCallback and the re-entrance caused problems.  So then I tried using a re-entrance flag, but that got messy because the sequence of events is more complex than I would have expected, and around this point I figured I must be missing something, so I'm asking here.  Please help!  Thanks in advance.</p>
  
  <p>BTW, the control doesn't support INotifyPropertyChanged, and implementing it is out of scope, because the control is big and I don't want to do that much work.</p>