将活动带到一条线?

时间:2012-08-10 18:39:29

标签: c# events

当用户点击按钮时,会激活此事件:

flightWindow.SendAirplaneLand += onAirplaneStartSend; 
flightWindow.SendAirplaneTakeOff += onAirplaneTakeOffSend;
flightWindow.SendAirplaneChangeRoute += onAirplaneChangeRouteSend;

他们都调用不同的方法将信息添加到列表中:

public void onAirplaneStartSend(object sender, Land e)
    {
        listBoxFlightEvents.Items.Add(e.LandStatus);
    }

    public void onAirplaneTakeOffSend(object sender, TakeOff e)
    {
        listBoxFlightEvents.Items.Add(e.TakeOffStatus);
    }

    public void onAirplaneChangeRouteSend(object sender, ChangeRoute e)
    {
        listBoxFlightEvents.Items.Add(e.ChangeRouteStatus);
    }

我的问题是我想将所有这些信息带到一行文本中以添加到列表中,我正在寻找一个简单的解决方案如何做到这一点?

一种方法可能是让方法返回一个字符串并将所有返回的字符串值的字符串放入其中,然后将其添加到列表中,如下所示:

public string onAirplaneStartSend(object sender, Land e)
    {
        return e.LandStatus;
    }

但是他可能不可能也不方便?

1 个答案:

答案 0 :(得分:2)

flightWindow.SendAirplaneLand += (s,e) => {
  OnAirplaneStatusChange(e.LandStatus);
};
flightWindow.SendAirplaneTakeOff += (s,e) => {
  OnAirplaneStatusChange(e.TakOffStatus);
};
flightWindow.SendAirplaneChangeRoute += (s,e) => {
  OnAirplaneStatusChange(e.ChangeRouteStatus);
};

private void OnAirplaneStatusChange(string status)
{
  listBoxFlightEvents.Items.Add(status);
}

虽然我还不完全确定你的目标是什么。除非LandTakeOffChangeRoute都继承了一些常见的(例如)AirplaceEventArgs(以及表示状态的公共属性),否则您必须单独绑定它们。最好的情况是使用通用EventArgs方法,但您需要以某种方式投射以获得LandStatusTakeOffStatusChangeRouteStatus值。

我建议:

public class AirplaneEventArgs : EventArgs
{
  public string Status { get; set; }
}
public class TakeOffEventArgs : AirplaneEventArgs
{
  /* other properties */
}
public class LandEventArgs : AirplaneEventArgs
{
  /* other properties */
}
public ChangeRouteEventArgs : AirplaneEventArgs
{
  /* other properties */
}

然后你可以简单地绑定:

flightWindow.SendAirplaneLand += OnAirplaneStatusChange; 
flightWindow.SendAirplaneTakeOff += OnAirplaneStatusChange;
flightWindow.SendAirplaneChangeRoute += OnAirplaneStatusChange;

private void OnAirplaneStatusChange(object sender, AirplaneEventArgs e)
{ 
    // they all now share "Status" proeprty so no need to cast to
    // get "LandStatus" vs. "ChangeRouteStatus" vs. "TakeOffStatus"
    // values.
    listBoxFlightEvents.Items.Add(e.Status);
}