Не определяется свойство зависимости в wpf?

271
02 июля 2017, 12:15

Разбираюсь со свойствами зависимости. Как я понял, что бы создать свойство зависимости необходимо проделать следующие шаги (сейчас буду их сравнивать с тем что делаю я) 1)создать статическое поле типа DependencyProperty - создал:

public static readonly DependencyProperty BrushPropert

2) в статическом конструкторе класса - зарегистрировать свойство

  • зарегистрировал:

    static MainWindow()
    {
      //регесртруем свойства зависимости
     BrushProperty = DependencyProperty.Register("Brush", typeof(Brush), 
       typeof(InkCanvas), new PropertyMetadata(1, new 
     PropertyChangedCallback(OnCurrentBrushProperty)));
    }`
    

2.1) new PropertyChangedCallback - принимает как делегат метод который будет реагировать на изменения свойства

3)создаем обычные свойства CLR

//свойсва CLR(обертка)
    public Brush Brush
    {
        get { return (Brush)GetValue(BrushSizeProperty); }
        set { SetValue(BrushSizeProperty, value); }
    }

Хочу отметить, что вот здесь, при регистрации свойства: Register("Brush", typeof(Brush), typeof(InkCanvas) - я указал typeof(InkCanvas) - т.к мне необходимо, что бы данное свойство появилось у InkCanvas, но оно не определяется -почему? Вроде же все по "инструкции" делал? Точнее как мне обращаться к эти свойствам - напрямую, прямо на экземпляре - как к обычным свойствам а не через SetValue и GetValue?

Answer 1

Вы не можете добавить свойство в существующий класс. Так DependencyProperty не работает. Вы можете, однако, добавить attached property, возможно, вам нужно именно это.

Например, так:

public static class InkCanvasExtensions
{
    public static Brush GetBrush(DependencyObject obj)
    {
        return (Brush)obj.GetValue(BrushProperty);
    }
    public static void SetBrush(DependencyObject obj, Brush value)
    {
        obj.SetValue(BrushProperty, value);
    }
    public static readonly DependencyProperty BrushProperty =
        DependencyProperty.RegisterAttached(
            "Brush", typeof(Brush), typeof(InkCanvas),
            new PropertyMetadata(null, (o, args) =>
                    OnCurrentBrushChange((InkCanvas)o, (Brush)args.NewValue)));
    static void OnCurrentBrushChange(InkCanvas canvas, Brush newBrush)
    {
        // работайте с ним
    }
}

При этом ваш XAML будет выглядеть как-то так:

<InkCanvas local:InkCanvasExtensions.Brush="Black"/>
READ ALSO
Нанооптимизация в цикле for

Нанооптимизация в цикле for

Например, есть массив с элементами

264
Запрет на создание процессов, работы с файловой системой и интернетом

Запрет на создание процессов, работы с файловой системой и интернетом

Доброго времени суток! При написании подсистемы тестирования пользовательских решений задач по программированию столкнулся с такой проблемой:

172
Как в Angular Material(1.0) использовать один компонент?

Как в Angular Material(1.0) использовать один компонент?

Добрый вечерЕсть вопрос, использую Angular Material для первого Angular'a

205