2

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
4

1 に答える 1

0

おそらく、コントロールから値を設定するときにセッターを使用しますか?

その場合は、セッターでSetValue呼び出しの前後にフラグを設定するだけです。次に、依存関係プロパティのイベントハンドラー内のコントロール自体からの変更であるかどうかを確認できます。

VB.Netで述べたように、C#コードについてお詫びしますが、その考えは理解できます。

protected bool LocallySet {get;set;}

public bool MyProperty
{
    get { return (bool)GetValue(MyDPProperty); }
    set 
    { 
        LocallySet = true;
        SetValue(MyDPProperty, value);
        LocallySet = false;
    }
}

重複する多数の制御イベントで問題が発生した場合は、代わりにカウンターを試してください。

protected int _LocallySetCount;

public bool MyProperty
{
    get { return (bool)GetValue(MyDPProperty); }
    set 
    { 
        _LocallySetCount++;
        SetValue(MyDPProperty, value);
        _LocallySetCount--;
    }
}

1つ以上の制御変更を処理している場合、カウントはゼロ以外になります。

あなたがあなたの財産のためのコードを投稿することができればそれは助けになるでしょう。

于 2012-08-10T14:02:57.957 に答える