.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; }
}
有什么帮助吗? :)
我有这个代码:
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; }
}
有什么帮助吗? :)