Проблема события изменения свойства зависимостей Silverlight

У меня есть настраиваемый элемент управления, у которого есть свойство зависимости... у него есть несколько, но скажем, Dragable - моя проблема. Свойство является логическим, и я хочу выполнять фрагмент кода каждый раз, когда он изменяется... переключатель.

У меня есть два варианта, оба показаны ниже

[Category("Modal Options")]
    public bool Dragable
    {
        get { return (bool)GetValue(DragableProperty); }
        set { SetValue(DragableProperty, value); toggleDragable(); }
    }

    // Using a DependencyProperty as the backing store for Dragable.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DragableProperty =
        DependencyProperty.Register("Dragable", typeof(bool), 
        typeof(PlussWindow), new PropertyMetadata(false));

    private void MakeDragable()
    {
        this.dragBehavior.Attach(this.LayoutRoot);
    }

    private void MakeUnDragable()
    {
        this.dragBehavior.Detach();
    }

    public virtual void toggleDragable()
    {
        if (this.Dragable)
        {
            MakeUnDragable();
        }
        else
        {
            MakeDragable();
        }
    }

or

[Category("Modal Options")]
    public bool Dragable
    {
        get { return (bool)GetValue(DragableProperty); }
        set { SetValue(DragableProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Dragable.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DragableProperty =
        DependencyProperty.Register("Dragable", typeof(bool), 
        typeof(PlussWindow), new PropertyMetadata(false, (o, e) => { (o as PlussWindow).toggleDragable(); } 
         ));

    private void MakeDragable()
    {
        this.dragBehavior.Attach(this.LayoutRoot);
    }

    private void MakeUnDragable()
    {
        this.dragBehavior.Detach();
    }

    public virtual void toggleDragable()
    {
        if (this.Dragable)
        {
            MakeUnDragable();
        }
        else
        {
            MakeDragable();
        }
    }

Каждый метод приводит к «Ссылка на объект, не установленная на экземпляр объекта».

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

Как мне это сделать, учитывая, что метод propertychanged является статическим?


person DavidA    schedule 02.02.2010    source источник
comment
Я помещаю код либо в установщик, либо использую переопределение PropertyMetaData, которое позволяет указать обработчик измененного события.   -  person DavidA    schedule 02.02.2010
comment
Где взять это исключение? Кстати, игнорируйте первый пример, второй пример кода - правильный подход.   -  person AnthonyWJones    schedule 02.02.2010
comment
Рассматривали ли вы вызов toggleDragable из внешнего кода? Глядя на это, я не думаю, что это проблема свойства Dependency, скорее всего, у вас есть ошибка в том, как вы используете эту вещь dragBehavior.   -  person AnthonyWJones    schedule 02.02.2010


Ответы (1)


Попробуй это:

public bool Dragable
    {
        get { return (bool)GetValue(DragableProperty); }
        set { SetValue(DragableProperty, value); }
    }

    public static readonly DependencyProperty DragableProperty =
        DependencyProperty.Register("Dragable", typeof(bool), typeof(PlussWindow), new PropertyMetadata(false, new PropertyChangedCallback(onDragableChange)));

    private static void onDragableChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        bool validate = (bool)e.NewValue;
        PlussWindow win = (PlussWindow) d;

        if (validate)
        {
            win.dragBehavior.Attach(this.LayoutRoot);
        }

        else
        {
            win.dragBehavior.Detach();
        }


    }
person mespinozas    schedule 04.02.2010