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)))

依赖属性更改处理程序:

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

大概您在从控件设置值时使用了设置器?

如果是这样,只需在 setter 中的 SetValue 调用之前和之后设置一个标志。然后您可以查看更改是否来自依赖属性的事件处理程序内的控件本身。

为 C# 代码道歉,正如你所说的 VB.Net,但你明白了。

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--;
    }
}

如果您正在处理一个或多个控制更改,则计数将非零。

如果您可以发布您的财产的代码,这将有所帮助。

于 2012-08-10T14:02:57.957 回答