2010-09-18 32 views
31

Tôi muốn có một sự kiện chỉ nhận một sự tranh chấp. Ví dụ:Sự kiện C# với các đối số tùy chỉnh

public enum MyEvents{ 
    Event1 
} 

// how do I declare this to take enum MyEvents as argument 
public static event EventHandler EventTriggered; 

public static void Trigger(MyEvent event) 
{ 
    if (EventTriggered != null) 
    { 
     EventTriggered(event); 
    } 
} 

Trả lời

21

Bạn khai báo một delegate cho các thông số:

public enum MyEvents { Event1 } 

public delegate void MyEventHandler(MyEvents e); 

public static event MyEventHandler EventTriggered; 

Mặc dù tất cả các sự kiện trong khuôn khổ mất một tham số đó là hoặc có nguồn gốc từ EventArgs, bạn có thể sử dụng bất kỳ thông số bạn muốn. Tuy nhiên, mọi người có thể mong đợi mô hình được sử dụng trong khuôn khổ, điều này có thể làm cho mã của bạn khó theo dõi hơn.

+0

Cảm ơn đây là những gì tôi đang tìm kiếm. Tôi đồng ý với bình luận của cậu. – Kenoyer130

+9

Bạn có thể rút ngắn điều đó dưới dạng 'sự kiện tĩnh công khai Action EventTriggered; ' –

4

Bạn cần khai báo trình xử lý sự kiện tùy chỉnh.

public class MyEventArgs: EventArgs 
{ 
    ... 
} 

public delegate void MyEventHandler(object sender, MyEventArgs e); 

public class MyControl: UserControl 
{ 
    public event MyEventHandler MyEvent; 
    ... 
} 
49

EventHandler nhận EventArgs làm tham số. Để giải quyết vấn đề của bạn, bạn có thể tự xây dựng MyEventArgs của riêng mình.

public enum MyEvents 
{ 
    Event1 
} 

public class MyEventArgs : EventArgs 
{ 
    public MyEvents MyEvent { get; set; } 
} 

public static event EventHandler<MyEventArgs> EventTriggered; 

public static void Trigger(MyEvents ev) 
{ 
    if (EventTriggered != null) 
    { 
     EventTriggered(null, new MyEventArgs { MyEvent = ev }); 
    } 
} 
+0

Sự khác biệt giữa sự kiện EventHandler EventName (Đề xuất của bạn) và đại biểu công khai void NewEventHandler (đối tượng người gửi, T e); sự kiện công khai NewEventHandler EventInstanceName; Cái nào trong số đó là "tốt hơn" và tại sao? – Prokurors

+3

@Prokurors cũ là "tốt hơn" bởi vì nó giúp bạn tiết kiệm từ tuyên bố một đại biểu mà thực sự là một bản sao của 'EventHandler '. –

0
public enum MyEvents 
{ 
    Event1 
} 

public class CustomEventArgs : EventArgs 
{ 
    public MyEvents MyEvents { get; set; } 
} 


private EventHandler<CustomEventArgs> onTrigger; 

public event EventHandler<CustomEventArgs> Trigger 
{ 
    add 
    { 
     onTrigger += value; 
    } 
    remove 
    { 
     onTrigger -= value; 
    } 
} 

protected void OnTrigger(CustomEventArgs e) 
{ 
    if (onTrigger != null) 
    { 
     onTrigger(this, e); 
    } 
} 
2

Dưới đây là được làm lại mẫu của bạn để giúp bạn bắt đầu.

  • mẫu của bạn có sự kiện tĩnh - bình thường hơn cho một sự kiện xuất phát từ một cá thể lớp, nhưng tôi đã để nó tĩnh bên dưới.

  • mẫu bên dưới cũng sử dụng OnXxx đặt tên chuẩn hơn cho phương pháp làm tăng sự kiện.

  • mẫu bên dưới không xem xét an toàn luồng, điều này cũng có thể là vấn đề lớn hơn nếu bạn nhấn mạnh vào sự kiện của bạn là tĩnh.

.

public enum MyEvents{ 
    Event1 
} 

public class MyEventArgs : EventArgs 
{ 
    public MyEventArgs(MyEvents myEvents) 
    { 
     MyEvents = myEvents; 
    } 

    public MyEvents MyEvents { get; private set; } 
} 

public static class MyClass 
{ 
    public static event EventHandler<MyEventArgs> EventTriggered; 

    public static void Trigger(MyEvents myEvents) 
    { 
     OnMyEvent(new MyEventArgs(myEvents)); 
    } 

    protected static void OnMyEvent(MyEventArgs e) 
    { 
     if (EventTriggered != null) 
     { 
      // Normally the first argument (sender) is "this" - but your example 
      // uses a static event, so I'm passing null instead. 
      // EventTriggered(this, e); 
      EventTriggered(null, e); 
     } 
    } 
} 
12

tôi có thể bị trễ trong game, nhưng làm thế nào về:

public event Action<MyEvent> EventTriggered = delegate { }; 

private void Trigger(MyEvent e) 
{ 
    EventTriggered(e); 
} 

Thiết sự kiện để một đại biểu vô danh tránh cho tôi để kiểm tra xem sự kiện này không phải là null.

Tôi thấy điều này có ích khi sử dụng MVVM, như khi sử dụng phương thức ICommand.CanExecute.

+0

ví dụ tuyệt vời sử dụng các lớp hiện có. –

Các vấn đề liên quan