Silverlight に DependencyProperty を持つカスタム コントロールがあります。プロパティの値がコントロール自体によって変更された場合、それは問題ありません。ただし、サーバーで値が変更された場合、コントロールはその内容をリロードする必要があります。
したがって、PropertyChangedCallback ルーチンでは、値を変更したのがコントロールであったのか、それともサーバー上で変更されたのかを確認できるようにしたいと考えています (この場合、コンテンツをリロードする必要があります)。
コントロールはテキスト ボックスであり、それが変更されると、SetValue を実行して DependencyProperty 値を変更しますが、PropertyChangedCallback ルーチンはそれを呼び出したのがコントロールかサーバーかを知りません。
PropertyChangedCallback がどこから呼び出されたかを確認するにはどうすればよいですか?
依存関係プロパティ:
Public Shared HtmlHolderProperty As DependencyProperty =
DependencyProperty.Register("HtmlHolder",
GetType(String),
GetType(HTMLEditor),
New PropertyMetadata(Nothing, New PropertyChangedCallback(AddressOf OnHtmlHolderChanged)))
Dependency Property Changed ハンドラ:
Private Shared Sub OnHtmlHolderChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim hte As HTMLEditor = DirectCast(d, HTMLEditor)
Dim newhtml As String = If(e.NewValue Is Nothing, "", e.NewValue)
Dim oldhtml As String = If(e.OldValue Is Nothing, "", e.OldValue)
If newhtml <> m_HtmlHolder AndAlso ControlUpdate > ControlUpdateTracker Then
hte.htb.Load(Format.HTML, newhtml)
ControlUpdateTracker = ControlUpdateTracker + 1
End If
m_HtmlHolder = newhtml
End Sub
バインディング:
Private Sub CreateBindings(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
Dim control As HTMLEditor = DirectCast(sender, HTMLEditor)
Dim context As IContentItem = DirectCast(control.DataContext, IContentItem)
Dim binding As Data.Binding
binding = New Data.Binding("Value") With {
.Source = context,
.Mode = Data.BindingMode.TwoWay
}
Me.SetBinding(HTMLEditor.HtmlHolderProperty, binding)
End Sub
コントロール _ContentChanged:
Private Sub htb_ContentChanged(sender As Object, e As RichTextBoxEventArgs) Handles htb.ContentChanged
Dim htb As Liquid.RichTextBox = DirectCast(sender, Liquid.RichTextBox)
SetValue(HtmlHolderProperty,htp.HTML)
End Sub