我在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?请不要替代解决方案。如果可能的话,我想用事件来做这件事。
答案 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}" >