2013-03-14 66 views
1

我在XAML中定義EventHandler時遇到問題。請看看代碼,你會明白我在做什麼以及我如何在XAML中分配一個方法,或者更好地說我是如何在XAML中定義EventHandler的。定義EventHandler <EventArgs>在XAML中

這是代碼:

public static EventHandler<EventArgs> GetResetValue(DependencyObject obj) 
{ 
    return (EventHandler<EventArgs>)obj.GetValue(ResetValueProperty); 
} 

public static void SetResetValue(DependencyObject obj, EventHandler<EventArgs> value) 
{ 
    obj.SetValue(ResetValueProperty, value); 
} 

// Using a DependencyProperty as the backing store for ResetValue. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty ResetValueProperty = 
    DependencyProperty.RegisterAttached("ResetValue", typeof(EventHandler<EventArgs>), typeof(Extension), new UIPropertyMetadata(null, OnResetValue)); 

private static void OnResetValue(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
{ 
    DependencyObject obj = dependencyObject; 
    for (; obj != null && !(obj is TextBox); obj = VisualTreeHelper.GetParent(obj)) ; 

    TextBoxtbx = obj as TextBox; 
    if (tbx != null) 
    { 
     tbx.TextChanged += (EventHandler<EventArgs>)dependencyPropertyChangedEventArgs.NewValue; 
    } 
} 

XAML看起來像這樣:

<TextBox> 
<Button> 
    <Label ext:Extension.ResetValue=".. here i want to assign the handler, as examle DoSomething" > 
</Button> 
</TextBox> 

我想分配給附接處理的方法,是內部Window.cs看起來像這樣作爲例子:

public void DoSomething(object sender, EventArgs e) 
{ 
    .... 
} 

正如你可以在OnResetValue方法中看到的,我沿着VisualTree行進,直到找到TextBox並添加TextBox.TextChanged事件處理程序。

當框TextChanged然後附加處理方法將被調用,它將調用指定的方法

的問題是我怎麼定義,在XAML附加投手與DoSomething的方法?請別無選擇。如果可能的話,我想用事件來做到這一點。

+0

請澄清你的問題。你已經明確地嘗試了一個解決方案,但是你需要說出什麼不起作用,以便人們可以幫助你。 – 2013-03-14 13:13:37

+0

我編輯了我的問題。分配不起作用。請閱讀第一句,您將知道在EventHandler 類型的附加屬性處理程序中定義/設置/分配方法時遇到問題。還要看看xaml,你會看到我希望將方法定義爲附加屬性處理程序的位置。 – 2013-03-14 13:36:07

回答

0

它看起來像你想使用正常XAML機制附加事件處理程序:

<Button Click="OnButtonClick"/> 

,但在你的情況你要分配給的是不是一個事件,而是一個正常屬性有一個恰好是EventHandler委託的類型。如果要將ResetValue的類型更改爲使用Action<object, EventArgs>,這可能會更清晰,這在功能上是相同的。

暴露你的處理方法,可分配給您的ResetValue屬性,你可以做這樣的事情的一種形式:

public EventHandler<EventArgs> DoSomethingMethod 
{ 
    get { return new EventHandler<EventArgs>(DoSomething); } 
} 

現在,你有你想要的DP的類型相匹配的屬性設置你可以使用正常的綁定:

<Label ext:Extension.ResetValue="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DoSomethingMethod}" > 
+0

正如我在答案中所說 - 你的代碼是分配給一個委託屬性,而不是一個事件。 – 2013-03-14 14:48:11

+0

它與事件會有何相似之處?我正在尋找不是routedevent的附加事件。 – 2013-03-14 14:52:19

+0

附加事件基於RoutedEvent,因此您無法將這兩者分開。 – 2013-03-14 15:46:17