DependencyProperty PropertyChangedCallback проводка - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть пользовательский элемент управления с UniformGrid, который имеет несколько кнопок. Я хочу назначить один и тот же обработчик для каждого события Click кнопки. Итак, я добавил следующее в пользовательский элемент управления:

    public RoutedEventHandler GridButtonClickHandler
    {
        get { return ( RoutedEventHandler ) GetValue ( GridButtonClickHandlerProperty ); }
        set { SetValue ( GridButtonClickHandlerProperty, value ); }
    }

    public static readonly DependencyProperty GridButtonClickHandlerProperty =
        DependencyProperty.Register ( "GridButtonClickHandler", typeof ( RoutedEventHandler ), typeof ( UniformGrid ),
            new PropertyMetadata ( GridButtonClickPropertyChanged ) );

    private static void GridButtonClickPropertyChanged ( DependencyObject o, DependencyPropertyChangedEventArgs e )
    {
        ( ( UniformGrid ) o ).Children.OfType<Button> ( ).ToList ( ).ForEach ( b => b.Click += ( RoutedEventHandler ) e.NewValue );
    }

Затем, где-то, где есть ссылка на пользовательский элемент управления (в данном примере numpad), у меня есть это:

numpad.GridButtonClickHandler += btn_clicked;

У меня есть точки останова для набора GridButtonClickHandler и метода GridButtonClickPropertyChanged; первые ударяются, когда происходит назначение, но вторые никогда не ударяются.

Видишь, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Вы зарегистрировали свойство зависимости на UniformGrid, чтобы установить для него обработчик, вам необходим экземпляр UniformGrid и следующий код:

uniformGrid.SetValue(MyUserControl.GridButtonClickHandlerProperty, new RoutedEventHandler(btn_clicked));

Если это не ваша цель и вы хотели бы использовать ее: numpad.GridButtonClickHandler += btn_clicked; где numpad - ваш пользовательский контроль.Тогда тип владельца должен быть вашим пользовательским контролем при регистрации:

public static readonly DependencyProperty GridButtonClickHandlerProperty =
        DependencyProperty.Register ( "GridButtonClickHandler", 
        typeof ( RoutedEventHandler ), 
        typeof ( MyUserControl),
            new PropertyMetadata ( GridButtonClickPropertyChanged ) );
0 голосов
/ 12 декабря 2011

Вам нужно перенаправленное событие, а не свойство зависимости ...

public static readonly RoutedEvent GridButtonClickEvent = EventManager.RegisterRoutedEvent("GridButtonClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyUserControl));

public event RoutedEventHandler GridButtonClick
{
    add { AddHandler(GridButtonClickEvent, value); }
    remove { RemoveHandler(GridButtonClickEvent, value); }
}

И когда нажата кнопка, вызвать событие:

private void GridButton_Click(object sender, RoutedEventArgs e)
{
    RaiseEvent(new RoutedEventArgs(GridButtonClickEvent, this));
}
...