我正在增強一個開源控件,以添加一些我需要的功能,並且我正陷入以下問題的絕望之中: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