Свойства зависимостей
Примечание.
Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.
Свойство зависимостей — это обычное свойство, которое сохраняет свое значение в хранилище свойств, а не, например, в переменной типа (поле).
Присоединенное свойство зависимостей — это разновидность свойства зависимостей, смоделированная как статические методы Get и Set, представляющие свойства, которые описывают связь между объектами и их контейнерами (например, позицию объекта Button
в контейнере Panel
).
✔ СЛЕДУЕТ️ предоставить свойства зависимостей для поддержки таких функций WPF, как применение стилей, триггеры, привязка данных, анимации, динамические ресурсы и наследование.
Разработка свойства зависимостей
✔️ При реализации свойств зависимостей они ДОЛЖНЫ быть производными от DependencyObject или одного из его подтипов. Тип обеспечивает очень эффективную реализацию хранилища свойств и автоматически поддерживает привязку данных WPF.
✔️ СЛЕДУЕТ️️ предоставить обычное свойство среды CLR и открытое статическое доступное только для чтения поле, в котором хранится экземпляр System.Windows.DependencyProperty для каждого свойства зависимостей.
✔ СЛЕДУЕТ️ реализовать свойства зависимостей, вызывая методы экземпляра DependencyObject.GetValue и DependencyObject.SetValue.
✔ СЛЕДУЕТ️ назвать статическое поле свойства зависимостей, добавив суффикс Property к имени свойства.
❌ НЕ задавайте явным образом значения по умолчанию для свойств зависимостей в коде. Вместо этого задайте их в метаданных.
Если вы явно задаете свойства по умолчанию, можно предотвратить задание этого свойства неявными средствами, такими как средство применения стилей.
❌ НЕ помещайте в методы доступа к свойствам код, отличный от стандартного кода для доступа к статическому полю.
Этот код не будет выполняться, если свойство задано неявными средствами, например средством применения стилей, так как оно использует статическое поле напрямую.
❌ НЕ используйте свойства зависимостей для хранения защищенных данных. Вы даже можете получить открытый доступ к частным свойствам зависимостей.
Разработка присоединенного свойства зависимостей
Свойства зависимостей, описанные в предыдущем разделе, представляют встроенные свойства объявляющего типа. Например, свойство Text
является свойством TextButton
, которое объявляет его. Присоединенное свойство зависимостей — это особый вид свойства.
Классическим примером присоединенного свойства является свойство Grid.Column. Свойство представляет положение столбца кнопок (не сетки). Однако оно используется только в том случае, если сетка содержит кнопку. Поэтому оно присоединено к кнопкам с помощью сеток.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0">Click</Button>
<Button Grid.Column="1">Clack</Button>
</Grid>
Присоединенное свойство, как правило, идентично обычному свойству зависимости, за исключением того, что методы доступа представлены статическими методами Get и Set:
public class Grid {
public static int GetColumn(DependencyObject obj) {
return (int)obj.GetValue(ColumnProperty);
}
public static void SetColumn(DependencyObject obj, int value) {
obj.SetValue(ColumnProperty,value);
}
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid)
);
}
Проверка свойства зависимостей
Свойства часто реализуют проверку. Логика проверки выполняется при попытке изменить значение свойства.
К сожалению, методы доступа к свойствам зависимостей не могут содержать произвольный код проверки. Вместо этого во время регистрации свойства необходимо указать логику проверки свойств зависимостей.
❌ НЕ помещайте логику проверки свойств зависимостей в методы доступа свойства. Вместо этого передайте обратный вызов проверки в метод DependencyProperty.Register
.
Уведомления об изменении свойства зависимостей
❌ НЕ реализуйте логику уведомления об изменении в методах доступа к свойствам зависимостей. Свойства зависимостей имеют встроенную функцию уведомлений об изменениях. Чтобы ее использовать, необходимо передать обратный вызов уведомления об изменении в PropertyMetadata.
Приведение значения свойства зависимостей
Если значение, переданное методу задания свойства, изменяется методом задания до фактического изменения хранилища свойств, выполняется приведение свойства.
❌ НЕ реализуйте логику приведения в методах доступа к свойствам зависимостей.
Свойства зависимостей имеют встроенную функцию приведения, которую можно использовать путем предоставления PropertyMetadata
обратного вызова приведения.
Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.
Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.