Значение атрибута по умолчанию может гарантировать достоверность атрибута.
Действительность проверки атрибута может использоваться для проверки входных атрибутов и обязательных обратных вызовов атрибутов, то есть уведомления должны быть сделаны независимо от того, изменились атрибуты или нет.
Уведомление об изменении атрибута: при изменении атрибута программа может быть уведомлена о необходимости выполнения ряда процессов.
Здесь нет ничего плохого в WPF, давайте посмотрим, как свойства зависимостей решают вышеуказанные проблемы.
Сводка содержимого определяет первый и простейший атрибут зависимости. Значение атрибута зависимости. Базовая операция. Метаданные атрибута оболочки атрибута (PropertyMetadata).
Основное поведение метаданных атрибутов
Хотя исходные слова MSDN прямолинейны, нет никаких сомнений в их точности. Как только вы это поймете, у вас возникнет другой опыт, когда вы посмотрите на это.
1. Определите первый и самый простой атрибут зависимости.
Исходные слова MSDN: Windows Presentation Foundation (WPF) предоставляет набор служб, которые можно использовать для расширения функциональности свойств среды CLR. Эти службы часто вместе называются системой свойств WPF. Свойства, поддерживаемые системой свойств WPF, называются свойствами зависимостей.
Давайте определим атрибут зависимости возраста следующим образом:
общественный класс DPCustomPeople
{
общедоступный статический только для чтения DependencyProperty AgeProperty =
DependencyProperty.Register("Возраст", typeof(int), typeof(DPCustomPeople));
публичная недействительность DisplayAgeProperty()
{
Console.WriteLine("DPName:" + DPCustomPeople.AgeProperty.Name);
Console.WriteLine("DPPropertyType:" + DPCustomPeople.AgeProperty.PropertyType);
Console.WriteLine("DPOWnerType:" + DPCustomPeople.AgeProperty.OwnerType);
}
}
Затем вызовите выходной результат
классная программа
{
static void Main(string[] args)
{
DPCustomPeople люди = новый DPCustomPeople ();
люди.DisplayAgeProperty();
}
}
Возможно, вы не знакомы с классом DependencyProperty. Класс DependencyProperty предоставляет некоторые основные характеристики свойств зависимостей.
Чтобы зарегистрировать свойство зависимости, необходимо вызвать статический метод Register объекта DependencyProperty, который предоставляет несколько перегруженных методов, но необходимо выполнить следующие три шага. После завершения регистрации это статическое свойство.
Укажите зарегистрированное имя (Имя) «Возраст»
Зарегистрировать тип свойства (PropertyType) typeof (int)
Зарегистрируйте тип владельца атрибута зависимости (OwnerType) typeof (DPCustomPeople)
Примечание. Имя атрибута, тип атрибута и тип владельца атрибута нельзя изменить после регистрации.
Ниже приведен результат вывода
2. Основные операции над значениями зависимых атрибутов (получение и присвоение значения)
После определения свойства зависимости Age мы сможем выполнять операции получения и присвоения значений для этого свойства. DependencyProperty сам по себе не предоставляет эти операции, но обрабатывается DependencyObject.
DependencyObject представляет объект, который участвует в системе свойств зависимостей.
Поэтому необходимо, чтобы определенный класс наследовался от DependencyObject, а затем переписать DPCustomPeople.
общедоступный класс DPCustomPeople:System.Windows.DependencyObject
{
}
Основные операции присвоения значения. Методы GetValue и SetValue.
общественная пустота DPPropertyBasicOperator()
{
Console.WriteLine("Возраст:" + this.GetValue(DPCustomPeople.AgeProperty));
this.SetValue(DPCustomPeople.AgeProperty, 24);
Console.WriteLine("ChangedAge:" + this.GetValue(DPCustomPeople.AgeProperty));
}
Вывод результатов
3. Оболочка атрибута использует методы GetValue и SetValue для работы со значениями, поэтому мы можем обернуть ее и определить атрибут Age.
public int Возраст
{
получить {возврат (int) GetValue (AgeProperty});
установить {SetValue (AgeProperty, значение});
}
Примечание. Соглашение об именах для упаковки зависимых свойств заключается в удалении следующего свойства.
общественная пустота DPPropertyBasicOperatorUsingProperty()
{
Console.WriteLine("Возраст:" + this.Age);
this.Age=24;
Console.WriteLine("ChangedAge:" + this.Age);
}
Выглядит ли приведенный выше код более лаконичным?
4. Метаданные свойств (PropertyMetadata)
Оригинал MSDN: Система свойств Windows Presentation Foundation (WPF) включает систему отчетов о метаданных, которая не ограничивается тем, что можно сообщить о свойстве посредством отражения или обычных функций CLR.
Говоря о метаданных атрибута, первое, что приходит на ум, — это атрибут .net.
общественный класс Человек
{
[Значение по умолчанию(200),Категория("Макет")]
общественная ширина int {получить;
}
Атрибут должен использовать возможности Visual Studio, чтобы обеспечить поддержку атрибута в IDE, или полагаться на отражение для присвоения значений.
Но без этих технологий new создает новый экземпляр по обычным каналам, и добавление атрибутов не имеет никакого эффекта. Мы не можем полагаться на эти атрибуты для обеспечения некоторых основных характеристик атрибутов (например, значений по умолчанию). атрибуты. Отличаются от метаданных, описанных выше.
Метаданные для свойств зависимостей
Может быть однозначно задан классом, в котором определено свойство зависимости. Может быть изменено при добавлении свойства зависимости в другой класс. Может быть явно переопределено всеми производными классами, которые наследуют свойство зависимости от определяющего базового класса. но Но это объясняет замысел. Но мы не всегда можем понять мысли дизайнера с первого раза. Давайте сначала узнаем о существовании этой концепции.
5. Базовое поведение метаданных атрибутов Базовое поведение метаданных атрибутов предоставляет три функции для зависимых атрибутов. Это также проблема, только что поднятая в этой статье.
Обязательный обратный вызов свойства уведомления о свойстве по умолчанию Давайте сначала рассмотрим конструктор полного PropertyMetadata. Если PropertyMetadata по умолчанию не задано для зависимого свойства, объект PropertyMetadata будет автоматически создан внутри зависимого свойства.
public PropertyMetadata (объект defaultValue, PropertyChangedCallback, свойствоChangedCallback, CoerceValueCallback coerceValueCallback)
Зависимые атрибуты заимствуют концепцию метаданных атрибута для завершения значений атрибута по умолчанию, уведомлений об атрибутах, принудительных обратных вызовов и другого поведения.
1. Значение атрибута по умолчанию
общедоступный статический только для чтения DependencyProperty NameProperty =
DependencyProperty.Register("Имя", typeof(строка), typeof(DPCustomPeople),
новые PropertyMetadata(string.Empty));
У большинства людей возникнет вопрос, когда они увидят это. Зачем использовать PropertyMetadata для установки значения по умолчанию? Почему бы не зарегистрировать его непосредственно в методе Register?
общедоступный статический только для чтения DependencyProperty NameProperty =
DependencyProperty.Register("Имя", typeof(строка), typeof(DPCustomPeople),
строка.Пусто);
Конечно, этот вопрос меня беспокоит уже давно, и я ничего не могу сделать, если не могу его решить, поэтому пока оставлю его в покое.
Примечание. При присвоении значения по умолчанию свойству в PropertyMetadata правильность типа определить невозможно.
Такое определение, поскольку значение по умолчанию сегмента кода dp в vs равно 0, на это стоит обратить внимание.
общедоступный статический только для чтения DependencyProperty NameProperty =
DependencyProperty.Register("Имя", typeof(строка), typeof(DPCustomPeople),
новый UIPropertyMetadata(0));
2. Операция восстановления значения атрибута по умолчанию.
После того как свойству присвоено значение, вы можете восстановить значение по умолчанию с помощью метода ClearValue объекта DependencyObject, как показано в следующем коде.
общедоступная строка Имя
{
получить {возврат (строка) GetValue (NameProperty});
установить { SetValue (NameProperty, значение });
}
общедоступный статический только для чтения DependencyProperty NameProperty =
DependencyProperty.Register("Имя", typeof(строка), typeof(DPCustomPeople),
новый UIPropertyMetadata(string.Empty));
общественная недействительность DPPropertyClearOperator()
{
Console.WriteLine("Имя:" + this.Name);
this.Name="Терри";
Console.WriteLine("ИзмененноеИмя:" + this.Name);
this.ClearValue(NameProperty);
Console.WriteLine("Имя:" + this.Name);
}
Вывод результатов
Примечание. Различайте назначение по умолчанию и значение по умолчанию.
Присвоение по умолчанию обычно выполняется в конструкторе, но это не значение по умолчанию (это было верно до появления свойств зависимостей), особенно когда производные классы переопределяют свойства.
Студент публичного класса: DPCustomPeople
{
публичныйстудент()
{
this.Name = "Небо";
}
общественная недействительность TestSubDefaultDpValue()
{
Console.WriteLine("Очистить перед:"+this.Name);
this.ClearValue(Student.NameProperty);
Console.WriteLine("Очистить после:" + this.Name);
}
}
Вывод результатов
3.Уведомление об изменении имущества
Эта функция используется чаще всего. При изменении значения свойства запускается обратный вызов PropertyChangedCallback.
общественный выбор IsBoy
{
получить {возврат (bool) GetValue (IsBoyProperty});
установить {SetValue (IsBoyProperty, значение});
}
общедоступный статический только для чтения DependencyProperty IsBoyProperty =
DependencyProperty.Register("IsBoy", typeof(bool), typeof(Студент),
новые UIPropertyMetadata(false,new PropertyChangedCallback(IsBoyPropertyChangedCallback)));
public static void IsBoyPropertyChangedCallback (DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Студент st = d как Студент;
если (ст.IsBoy)
{
Console.WriteLine("Привет, мальчик");
}
еще
{
Console.WriteLine("Привет,Девочка");
}
}
общественный недействительный TestPropertyChangedCallback()
{
this.IsBoy = ложь;
this.IsBoy = правда; this.IsBoy = правда;
}
Вы можете просмотреть результаты вывода старого значения и нового значения через DependencyPropertyChangedEventArgs.
Примечание:
(1). Видели ли вы, что значения зависимых свойств по умолчанию не вызывают уведомления об изменении свойств?
(2) Вручную запускать уведомления об изменении атрибутов.
Если вы хотите, чтобы значение по умолчанию инициировало изменение свойства (на самом деле, иногда это действительно необходимо), вам не нужно ждать и запускать его вручную.
частная пустота RaiseIsBoyPropertyChangedCallback()
{
IsBoyPropertyChangedCallback (это, новый DependencyPropertyChangedEventArgs
(Student.IsBoyProperty, Student.IsBoyProperty.DefaultMetadata.DefaultValue, ноль));
}
(3) При появлении уведомления об изменении атрибута обязательно убедитесь в правильности типа значения атрибута по умолчанию.
Мы знаем, что типы значений имеют значения по умолчанию, а ссылочные типы — нет (то есть им можно присвоить значение null). Наличие типа по умолчанию можно проверить с помощью ключевого слова default, как показано ниже.
Мы переписываем значение по умолчанию для свойства зависимости, определенного выше, на ноль. Оно может работать нормально, когда нет PropertyChangedCallback, но когда появляется уведомление об изменении свойства, происходит катастрофа, и программа выдает исключение, сообщая, что тип не соответствует. соответствовать.
общедоступный статический только для чтения DependencyProperty IsBoyProperty =
DependencyProperty.Register("IsBoy", typeof(bool), typeof(Студент),
новый UIPropertyMetadata(null,new PropertyChangedCallback(IsBoyPropertyChangedCallback)));
Давайте еще раз посмотрим на ссылочный тип. Если значение по умолчанию равно нулю, все будет в порядке.
общественный IList LovedGirl
{
получить {вернуться (IList)GetValue(LovedGirlProperty});
set { SetValue (LovedGirlProperty, значение});
}
общедоступный статический только для чтения DependencyProperty LovedGirlProperty =
DependencyProperty.Register("LovedGirl", typeof(IList), typeof(Student),
новый UIPropertyMetadata(null, новый PropertyChangedCallback(LovedGirlChangedCallback)));
public static void LovedGirlChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Студент st = d как Студент;
foreach (элемент var в e.NewValue как IList)
{
Console.WriteLine(элемент);
}
}
общественная недействительность TestReferenceDpType()
{
Список<строка> список = новый список<строка>();
list.Add("девушка 1");
list.Add("девушка 2");
this.LovedGirl = список;
}
4. Принудительный обратный вызов атрибута
Прежде всего, значение по умолчанию по-прежнему не запускает метод обратного вызова.
Метод принудительного обратного вызова означает, что независимо от того, изменится значение атрибута или нет, будет введен метод обратного вызова.
общественный int Оценка
{
получить {возврат (int) GetValue (ScoreProperty});
установить {SetValue (ScoreProperty, значение});
}
общедоступный статический только для чтения DependencyProperty ScoreProperty =
DependencyProperty.Register("Оценка", typeof(int), typeof(Студент),
новый UIPropertyMetadata(0,null,new CoerceValueCallback(ScoreCoerceValueCallback)));
общедоступный статический объект ScoreCoerceValueCallback (DependencyObject d, объект baseValue)
{
Console.WriteLine(baseValue);
вернуть базовое значение;
}
общественная пустота TestCoerceValueCallback()
{
это.Оценка = 0;
это.Оценка = 0;
это.Оценка = 0;
}