2010-09-23 114 views
3

我有一个自定义事件,并希望附加一个属性(一个字符串将罚款)。 什么我需要在我的代码更改:我如何将属性附加到自定义事件?

public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
     "ModelClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(InfoBox)); 

    // Provide CLR accessors for the event 
    public event RoutedEventHandler FadeIn 
    { 
     add { AddHandler(ModelClickEvent, value); } 
     remove { RemoveHandler(ModelClickEvent, value); } 
    } 

    // This method raises the Tap event 
    void RaiseTapEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(InfoBox.FadeInEvent); 
     RaiseEvent(newEventArgs); 
    } 

回答

8

首先,你需要创建一个包含新特性新RoutedEventArgs派生类。喜欢的东西:

public class ModelClickEventArgs : RoutedEventArgs 
{ 
    public string MyString { get; set; } 
    public ModelClickEventArgs() : base() { } 
    public ModelClickEventArgs(RoutedEvent routedEvent) : base(routedEvent) { } 
    public ModelClickEventArgs(RoutedEvent routedEvent, object source) : base(routedEvent, source) { } 
} 

然后,你必须创建一个使用新的事件参数的委托:

public delegate void ModelClickEventHandler(object sender, ModelClickEventArgs e); 

之后,你将不得不做出上述更改您的代码,以便它使用这些新的对象:

public static readonly RoutedEvent ModelClickEvent = EventManager.RegisterRoutedEvent(
     "ModelClick", RoutingStrategy.Bubble, typeof(ModelClickEventHandler), typeof(Window)); 

// Provide CLR accessors for the event 
public event ModelClickEventHandler FadeIn 
{ 
    add { AddHandler(ModelClickEvent, value); } 
    remove { RemoveHandler(ModelClickEvent, value); } 
} 

// This method raises the Tap event 
void RaiseTapEvent() 
{ 
    ModelClickEventArgs newEventArgs = new ModelClickEventArgs(); 
    newEventArgs.MyString = "some string"; 
    RaiseEvent(newEventArgs); 
} 
2

如果你的意思是你想一个属性添加到R​​outedEventArgs对象的处理程序接收,那么所有你需要做的就是宣布自RoutedEventArgs继承的类并有你想添加的属性(-y/-ies)。

它看起来像下面这样:

public class ModelRoutedEventArgs : RoutedEventArgs 
{ 
    public string ExtraMessage { get; set; } 
    public ModelRoutedEventArgs(RoutedEvent routedEvent, string message) : base(routedEvent) 
    { 
    ExtraMessage = message; 
    } 
    // anything else you'd like to add can go here 
} 

或者,而不是添加一个构造函数重载,你可以实例化您的自定义RoutedEventArgs类,并把它传递给RaiseEvent()调用之前设置该属性。

+0

看来你不能像这样的构造函数:base(RoutedEvent); 它一直说“在这种情况下使用base-command是不可能的, – Hedge 2010-09-23 15:20:21

+0

好的,我会编辑我的答案,看起来你可以链接构造函数调用。 – 2010-09-23 16:45:16

相关问题