在XAML中定义EventHandler <eventargs> </eventargs>

时间:2013-03-14 10:37:04

标签: c# wpf xaml wpf-controls

我在XAML中定义EventHandler时遇到问题。请查看代码,您将了解我正在尝试做什么,以及我如何尝试在XAML中分配方法或更好地说明我如何在XAML中定义EventHandler。

这是代码:

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时,将调用附加的处理程序方法,该方法将调用指定的方法

问题是如何使用DoSomething方法在XAML中定义附加的hander?请不要替代解决方案。如果可能的话,我想用事件来做这件事。

1 个答案:

答案 0 :(得分: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}" >