我有一个对象(实际上是一个可视元素和一个viewmodel元素),我想在整个项目中的多个位置使用它。目标的功能是收集付款信息。客户史密斯从我的公司订购了一个Widget,但他付款迟了。他打电话给我说他会在1日全额支付这笔款项。我填写付款金额和日期,点击一个按钮,然后用史密斯先生建议的付款信息将一个条目添加到我的数据库中。何时以及为什么要使用自定义事件处理程序
现在,正如我所说的,我想在多个地方使用这个对象,并根据我在哪里使用它,我可能希望在点击提交按钮后发生更多事情。除Widgets之外,我还销售Whatsits和Whoozits。收到Whatsit的付款信息后,我想填充一张额外的表格,以便向客户发送提醒。输入Whoozit付款信息后,我想填充提醒表,并立即向客户发送短信确认。
我最初的想法是简单地将List<Action>
字段添加到我的原始对象,并根据我从哪里访问它,将原始数据库更新完成后我想要完成的任何其他操作发送给我。
事情是这样的:
public class MoneyGetter
{
public List<Action> AfterEvents = new List<Action>();
public void SavePaymentInfo()
{
//logic for initial database entry
foreach(var a in AfterEvents)
{
a.Invoke();
}
}
}
和创建对象,这取决于我使用它在那里后,我只需添加
var mg = new MoneyGetter();
mg.AfterEvents.Add(() => { /* add situation specific action logic here */ });
通过一些这之后,还我想这是事件的原因(我认为),我应该为我的MoneyGetter对象创建一个自定义的OnSubmitted事件,从任何对象使用它的事件订阅该事件,并在初始数据库条目之后引发事件。
是这样吗?如果是这样,为什么要创建一个自定义事件处理程序的麻烦比一个List<Action>
更好?
你不需要,你总是可以从EventArgs的延伸只是定制ARGS,并且使用的buildin处理 – sTrenat
你碰巧使用MVVMlight?有一个内置的Messenger。 – Fildor
是的,事件在这种情况下应该是有用的。没有令人信服的理由,我认为它需要成为一个自定义事件。你可能已经进入了这种思维定势,因为你太过于关注“添加”了。事件已经自己完成了,所有你需要的是订阅事件的+ =操作符。 –