为了账号安全,请及时绑定邮箱和手机立即绑定

属性更改时引发事件

属性更改时引发事件

C#
当年话下 2021-12-05 16:54:25
当属性的值改变时,我需要引发一个事件。就我而言,这是更改 webView.Source 的时间。我无法创建派生类,因为该类被标记为已密封。有没有办法引发事件?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

属性更改时引发事件


对于这种情况,您可以创建一个DependencyPropertyWatcher来检测DependencyProperty更改的事件。下面是可以直接使用的工具类。


public class DependencyPropertyWatcher<T> : DependencyObject, IDisposable

{

    public static readonly DependencyProperty ValueProperty =

        DependencyProperty.Register(

            "Value",

            typeof(object),

            typeof(DependencyPropertyWatcher<T>),

            new PropertyMetadata(null, OnPropertyChanged));


    public event DependencyPropertyChangedEventHandler PropertyChanged;


    public DependencyPropertyWatcher(DependencyObject target, string propertyPath)

    {

        this.Target = target;

        BindingOperations.SetBinding(

            this,

            ValueProperty,

            new Binding() { Source = target, Path = new PropertyPath(propertyPath), Mode = BindingMode.OneWay });

    }


    public DependencyObject Target { get; private set; }


    public T Value

    {

        get { return (T)this.GetValue(ValueProperty); }

    }


    public static void OnPropertyChanged(object sender, DependencyPropertyChangedEventArgs args)

    {

        DependencyPropertyWatcher<T> source = (DependencyPropertyWatcher<T>)sender;


        if (source.PropertyChanged != null)

        {

            source.PropertyChanged(source.Target, args);

        }

    }


    public void Dispose()

    {

        this.ClearValue(ValueProperty);

    }

}

用法


var watcher = new DependencyPropertyWatcher<string>(this.MyWebView, "Source");

watcher.PropertyChanged += Watcher_PropertyChanged;


private void Watcher_PropertyChanged(object sender, DependencyPropertyChangedEventArgs e)

{


}


查看完整回答
反对 回复 2021-12-05
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以使用装饰器来包装原始类并为装饰属性引发事件。


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 193 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信