在XAML中创建依赖属性以设置自定义事件处理程序

7
我希望能够使用DependencyProperties向默认框架元素添加自定义事件处理程序。类似以下代码:
<Border custom:MyProps.HandleMyEvent="someHandler">...</Border>

这是包含 Border 元素的控件的后台代码:

public class MyPage : Page{
    public void someHandler(object sender, EventArgs e){
        //do something
    }
}

以下是我对定义该属性的类的初步示例:

public class MyProps{
    public event EventHandler MyInternalHandler;
    public static readonly DependencyProperty HandleMyEventProperty = ...
    public void SetHandleMyEvent(object sender, EventHandler e){
         MyInternalHandler += e;
    }
}

问题在于我不知道/没有找到任何提示如何将DependencyProperties与事件/委托和EventHandlers结合起来。
你有什么线索吗?

我们能否得到一些关于这个解决方案所解决的问题的提示吗? 如果您想要向默认框架元素添加事件,只需子类化或使用行为即可。 - Graeme Bradbury
1个回答

5
我假设这与WPF无关,这是一个Silverlight问题。首先,您不能简单地向现有控件添加事件。毕竟,您正在添加附加属性,而事件处理方式不同,它们不是属性。您需要创建一个新类型,该类型具有此事件,然后创建此类型的附加属性。以下是一个基本类型,它只有一个事件:
public class MyEventer
{
    public event EventHandler MyEvent;

    // What would call this??
    protected void OnMyEvent(EventArgs e)
    {
      if (MyEvent != null)
         MyEvent(this, e);
    }
}

现在我们创建一个附加属性,其属性为MyEventer,我更喜欢将它们放在一个单独的静态类中。
public static class MyProps
{

  public static MyEventer GetEventer(DependencyObject obj)
  {
     return (MyEventer)obj.GetValue(EventerProperty );
  }

  public static void SetEventer(DependencyObject obj, MyEventer value)
  {
    obj.SetValue(EventerProperty , value);
  }

  public static readonly DependencyProperty EventerProperty =
        DepencencyProperty.RegisterAttached("Eventer", typeof(MyEventer), typeof(MyProps), null)

  }
}

现在您可以像这样将其附加到控件:-
<Border ...>
   <custom:MyProps.Eventer>
      <custom:MyEventer MyEvent="someHandler" />
   </custom:MyProps.Eventer>
</Border>

如果在编写此XAML之前编译项目,您会注意到Visual Studio会为您提供选项,让它在代码后台为您创建事件处理程序。

当然,这仍然存在一个重要问题:您打算如何触发该事件?


该事件由我编写的框架触发。正如您正确演示的那样,我需要一些OnMyEvent函数来轻松触发用户定义的处理程序。 现在用户可以定义自定义处理程序或使用XAML中的tab键生成新处理程序。非常好,即使我更喜欢直接使用DependencyProperty而不是额外的<c:MyProps.Eventer> <c:MyClass Handler =“...”/>..> ..>。 <Border c:MyProps.MyHandler =“...”/>会更好用。 无论如何,感谢您宝贵的意见! :) - Juve
命名规范遵从得不太好。 - Mathias Lykkegaard Lorenzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接