Наследование привязанного поведения - PullRequest
4 голосов
/ 10 мая 2011

Я хотел бы реализовать набор похожих подключенных поведений для использования в приложении WPF. Поскольку все они имеют общий шаблонный код, который я не хочу повторять для каждого, я хотел бы создать базовое поведение, наследуемое от него. Но так как все в прикрепленном поведении статично, я не знаю, как это сделать.

В качестве примера возьмем это поведение, которое выполняет метод для mousedown (реальное поведение, конечно, будет делать что-то непростое в обработчике событий):

public static class StupidBehavior
{
    public static bool GetIsEnabled(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsEnabledProperty);
    }

    public static void SetIsEnabled(DependencyObject obj, bool value)
    {
        obj.SetValue(IsEnabledProperty, value);
    }

    // Using a DependencyProperty as the backing store for ChangeTooltip.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IsEnabledProperty =
        DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(StupidBehavior), new UIPropertyMetadata(false, IsEnabledChanged));


    private static void IsEnabledChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        ((UIElement)sender).MouseDown += { (o,e) => MyMethod(); };
    }

    private static void MyMethod()
    {
        MessageBox.Show("Boo");
    }     
}

Теперь я хотел бы создать новое поведение, которое должно иметь другую реализацию MyMethod, а также несколько дополнительных свойств, управляющих им. Как это сделать?

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Вы можете создать другое присоединенное свойство, которое содержит подробную реализацию, которая вызывается основным поведением в качестве замены подкласса.Объект, который хранится в этом свойстве, может быть нестатичным и использоваться как объект-состояния .

(. Возможно, вы также можете поместить это в одно свойство, где property == nullозначает выключено )

1 голос
/ 10 мая 2011

Вы можете использовать статический конструктор, чтобы сформировать Dictionary<DependencyProperty,EventHandler> для сопоставления определенного DP с определенным обработчиком и использовать общий DependencyPropertyChanged обратный вызов:

static StupidBehavior()
{
    handlerDictionary[IsEnabledProperty] = (o,e) => MyMethod();
    handlerDictionary[SomeOtherProperty] = (o,e) => SomeOtherMethod();
}

private static void CommonPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    var uie = sender as UIElement;
    if (uie != null)
    {
        //removing before possibly adding makes sure the multicast delegate only has 1 instance of this delegate
        sender.MouseDown -= handlerDictionary[args.Property];
        if (args.NewValue != null)
        {
            sender.MouseDown += handlerDictionary[args.Property];
        }
    }
}

Или просто сделать switch наargs.Property.Или что-то промежуточное, что включает в себя общий метод и ветвление на основе DependencyProperty.

И я не уверен, почему ваше свойство IsEnabled имеет значение типа DependencyProperty, а не что-то, чтобудет иметь более смысловой смысл, как bool.

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