1

我在 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 中定义附加的处理程序?请不要替代解决方案。如果可能的话,我想用事件来做到这一点。

4

1 回答 1

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}" >
于 2013-03-14T14:08:36.490 回答