我正在增强一个开源控件,以添加一些我需要的功能,并且我正陷入以下问题的绝望之中:Silverlight依赖属性snafu,我做错了什么?
控件是一个支持HTML但不通过属性的富文本框;你必须做这样的事情:
var sHtml = "..."
ctrl.LoadHtml(sHtml)
和
var sHtml = ctrl.SaveHtml()
到目前为止好。但我想通过设置数据绑定的HTML,所以我做了称为HTML依赖属性:
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);
}
这一切工作正常。我遇到的问题是,当控制内容发生变化时,我无法知道如何通知财产系统。该控制装置具有一个ContentChanged事件,所以我想这:
private void rtb_ContentChanged(object sender, RichTextBoxEventArgs e)
{
//tell the html prop that it changed
SetValue(HtmlProperty, rtb.SaveHtml());
}
但这然后触发HtmlChangedCallback和再侵入引起的问题。所以我尝试使用重新入口的标志,但是这样做很麻烦,因为事件的顺序比我预期的要复杂得多,而且在这一点上,我想我必须错过一些东西,所以我在这里问。请帮忙!提前致谢。
顺便说一句,该控件不支持INotifyPropertyChanged,并且实现它超出了范围,因为控件很大,我不想做那么多工作。
“再入口”的原因是什么问题? – Jacob 2010-08-09 22:49:14
嗯,最初的问题是,在HtmlChangedCallback中,我将HTML加载到控件中,该控件触发Content_Changed事件,并调用Content_Changed中的SetValue导致HtmlChangedCallback触发,并且在Silverlight转义出无限循环之前我看到了很多轮。我试着自己设置一个再入口标志,但是我发现事件的顺序是不可预测的,有时他们的事件会不顺序,而不是试图弄清楚,我可以告诉我做错了事,如果我不得不砍掉那么多。 – 2010-08-09 23:05:25