Создайте свойства зависимостей для настройки пользовательских EventHandlers в XAML - PullRequest
5 голосов
/ 16 февраля 2010

Я хочу добавить собственные обработчики событий к элементам каркаса по умолчанию, используя 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.

У вас есть подсказка?

1 Ответ

5 голосов
/ 16 февраля 2010

Я собираюсь предположить, что это не имеет никакого отношения к WPF, это вопрос серебряного света.

Прежде всего, вы не можете просто добавить Event к существующему элементу управления. В конце концов, вы добавляете присоединенный Properties, тогда как события обрабатываются по-другому, они не являются свойствами.

Вам необходимо создать новый тип с этим событием, а затем создать присоединенное свойство этого типа.

Вот базовый тип, который просто имеет событие: -

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 предложит вам возможность создать обработчик событий в приведенном ниже коде.

Конечно, это все еще оставляет важный вопрос: как вы намеревались вызвать событие?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...