Свойства зависимостей

Примечание.

Это содержимое перепечатывается разрешением 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.

См. также