绑定后如何捕获属性更改事件

时间:2022-06-14 00:08:35

I have a custom UserControl:

我有一个自定义UserControl:

public partial class CustomCtrl : UserControl
{
    public CustomCtrl()
    {
        InitializeComponent();
    }

    public string Prova
    {
        get { return (string)GetValue(ProvaProperty); }
        set 
        {
            SetValue(ProvaProperty, value); 
        }
    }

    public static readonly DependencyProperty ProvaProperty =
        DependencyProperty.Register("Prova", typeof(string), typeof(CustomCtrl));

}

I do this simple binding:

我做这个简单的绑定:

CustomCtrl c = new CustomCtrl();
TextBlock t = new TextBlock();
c.SetBinding(CustomCtrl.ProvaProperty, new Binding("Text") { Source = t });
t.Text = "new string";

Now c.Prova is "new string", but how can I catch in my CustomControl class the event informing me that Prova has changed?

现在c.Prova是“新字符串”,但是如何在我的CustomControl类中捕获告知我Prova已更改的事件?

2 个解决方案

#1


3  

Something like this (this will catch changes on all instances of CustomCtrl):

像这样的东西(这将捕获CustomCtrl的所有实例上的更改):

public static readonly DependencyProperty ProvaProperty =
    DependencyProperty.Register(
    "Prova",
    typeof(string),
    typeof(CustomCtrl),
    new PropertyMetadata( new PropertyChangedCallback(OnValueChanged) )
);

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // This is called whenever the Prova property has been changed.
}

If "clients" of your CustomCtrl wanted to catch a change to that property for a specific instance then they could use:

如果CustomCtrl的“客户端”想要捕获特定实例的该属性的更改,那么他们可以使用:

CustomCtrl instanceofsomecustomctrl = .......

DependencyPropertyDescriptor descr = 
                  DependencyPropertyDescriptor.FromProperty(CustomCtrl.ProvaProperty, typeof(CustomCtrl));

if (descr != null)
{
    descr.AddValueChanged(instanceofsomecustomctrl, delegate
        {
            // do something because property changed...
        });
} 

#2


1  

I think this is what you're looking for, you want an event onChangeHandler.

我想这就是你要找的东西,你想要一个onChangeHandler上的活动。

public partial class CustomCtrl : UserControl
{
public CustomCtrl()
{
    InitializeComponent();
}

public string Prova
{
    get { return (string)GetValue(ProvaProperty); }
    set 
    {
        SetValue(ProvaProperty, value); 
        OnPropertyChanged("Prova");
    }
}
protected void OnPropertyChanged(string prova)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(prova));
        }
    }
 //This portion could go in the class where the event takes place
 private delegate void UpdateDelegate(DependencyProperty dp, Object value);


}

#1


3  

Something like this (this will catch changes on all instances of CustomCtrl):

像这样的东西(这将捕获CustomCtrl的所有实例上的更改):

public static readonly DependencyProperty ProvaProperty =
    DependencyProperty.Register(
    "Prova",
    typeof(string),
    typeof(CustomCtrl),
    new PropertyMetadata( new PropertyChangedCallback(OnValueChanged) )
);

private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // This is called whenever the Prova property has been changed.
}

If "clients" of your CustomCtrl wanted to catch a change to that property for a specific instance then they could use:

如果CustomCtrl的“客户端”想要捕获特定实例的该属性的更改,那么他们可以使用:

CustomCtrl instanceofsomecustomctrl = .......

DependencyPropertyDescriptor descr = 
                  DependencyPropertyDescriptor.FromProperty(CustomCtrl.ProvaProperty, typeof(CustomCtrl));

if (descr != null)
{
    descr.AddValueChanged(instanceofsomecustomctrl, delegate
        {
            // do something because property changed...
        });
} 

#2


1  

I think this is what you're looking for, you want an event onChangeHandler.

我想这就是你要找的东西,你想要一个onChangeHandler上的活动。

public partial class CustomCtrl : UserControl
{
public CustomCtrl()
{
    InitializeComponent();
}

public string Prova
{
    get { return (string)GetValue(ProvaProperty); }
    set 
    {
        SetValue(ProvaProperty, value); 
        OnPropertyChanged("Prova");
    }
}
protected void OnPropertyChanged(string prova)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(prova));
        }
    }
 //This portion could go in the class where the event takes place
 private delegate void UpdateDelegate(DependencyProperty dp, Object value);


}