.NET c# - 如何将附加数据传递给 PropertyChangedEventHandler

.NET c# - how to pass aditional data to PropertyChangedEventHandler

我有这个代码:

public void SomeMethod() 
{
    MyClass clss = new MyClass();    //note: MyClass implements INotifyPropertyChanged
    clss.DoSomething();
    clss.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyEventHandler);
}
static void MyEventHandler(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{
    Debug.WriteLine("some property on MyClass has changed!");
}

这工作正常,当 SomeClass 中的 属性 更改时,MyEventHandler() 为 运行。 但是现在我需要将附加数据从 SomeMethod() 传递到 MyEventHandler() ,我该怎么做?

* 更新 *

好的,我想我应该更好地解释整个问题:MyClass 中的方法 DoSomething() 调用外部 Web 服务,向其传递回调,以便当 Web 服务完成其工作,它将调用回调,将操作结果传递给它一个值。在该回调中,我正在更改 class 的 属性 以为其分配从 Web 服务接收到的值,从而触发 propertyChanged 事件。 然后在调用者 class 中,我订阅了那个事件,这样我就可以在它发生时做一些事情。

最后的 objective 是,在调用 DoSomething() 之后,能够等到 Web 服务完成其工作并 returned 结果,这样我就可以保存一些数据库中的东西等等,只有这样,return 来自 SomeMethod()...

所以这是 MyClass,简化版:

public class MyClass : INotifyPropertyChanged
{
    private long _wsReturnValue;
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    public long wsReturnValue 
    {
        get { return _wsReturnValue; }
        set {
            _wsReturnValue = value;
            OnPropertyChanged("wsReturnValue");
        }
    }
    protected void OnPropertyChanged(string name) 
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) 
            handler(this, new System.ComponentModel.PropertyChangedEventArgs(name));
    } 

    public void DoSomething(object entity) 
    {
        //here I just call external web service and returns, the webservice will call TheCallback() when finished
    }

    public void TheCallback(CommunicationEventArgs e) 
    {
        this.wsReturnValue = e.res;
    }

}        

这是使用 MyClass 的 class:

class MainClass
{
    public void SomeMethod(object someObject)
    {
        MyClass clss = new MyClass();    //note: MyClass implements INotifyPropertyChanged
        clss.DoSomething(someObject);   //someObject contains data that I want to use later in the event handler
        clss.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyEventHandler);
    }

    private static void MyEventHandler(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        //here I need to use the object someObject...
    }
}

不确定这是否接近您的意思,但是您可以了;

class EventClass
    {
        public void SomeMethod()
        {
            MyClass clss = new MyClass();    //note: MyClass implements INotifyPropertyChanged
            clss.DoSomething(new object());
            clss.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(MyEventHandler);
        }

        private static void MyEventHandler(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            var customeEventArgs = (CustomEventArgs) e;
            Debug.WriteLine("some property on MyClass has changed! Extra Data : {0}", customeEventArgs.ExtraData);
        }
    }

实现了更多shell代码来说明

internal class MyClass
    {
        public void DoSomething(object data)
        {

            var e = new CustomEventArgs("Property")
            {
                ExtraData = data
            };

            PropertyChanged?.Invoke(this, e);
        }

        public event PropertyChangedEventHandler PropertyChanged;


    }

internal class CustomEventArgs : PropertyChangedEventArgs
    {
        public CustomEventArgs(string propertyName) : base(propertyName)
        {
        }

        public object ExtraData { get; set; }
    }

有什么帮助吗? :)