Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Свойства зависимостей только для чтения можно использовать для предотвращения установки значений свойств за пределами кода. В этой статье рассматриваются существующие свойства зависимостей только для чтения и сценарии и методы создания настраиваемого свойства зависимостей только для чтения.
Предпосылки
В статье предполагается, что у вас есть базовые знания о свойствах зависимости и что вы прочитали Обзор свойств зависимостей. Чтобы следовать примерам в этой статье, это поможет вам, если вы знакомы с языком разметки расширяемых приложений (XAML) и узнаете, как писать приложения WPF.
Существующие зависимости с доступом только для чтения
Свойства зависимостей только для чтения обычно сообщают о состоянии и не должны изменяться через public метод доступа. Например, платформа Windows Presentation Foundation (WPF) реализует IsMouseOver свойство только для чтения, так как его значение должно определяться только входными данными мыши. Если IsMouseOver разрешит другие методы ввода, его значение может стать несогласованным с вводом с мыши. Хотя через public метод доступа невозможно настроить, значения многих существующих свойств зависимостей, доступных только для чтения, определяются несколькими входными данными.
Использование только для чтения свойств зависимостей
Свойства зависимостей, доступные только для чтения, не подходят для некоторых сценариев, в которых свойства зависимостей обычно предоставляют решение. Не применимые сценарии включают привязку данных, применение стиля к значению, проверке, анимации и наследованию. Однако зависимое свойство только для чтения можно использовать как триггер свойства в стиле. Например, IsMouseOver обычно используется для активации изменений в фоновом режиме, переднем плане или другом видимом свойстве элемента управления при переключке мыши. Система свойств WPF обнаруживает изменения в свойствах зависимости, доступных только для чтения, и сообщает о них, таким образом поддерживая функциональность триггеров свойств. Свойства зависимостей только для чтения также полезны при реализации свойства зависимости коллекционного типа, где только элементы коллекции должны быть доступными для записи, а не сам объект коллекции. Дополнительные сведения см. в разделе "Свойства зависимости типа коллекции".
Замечание
Только свойства зависимостей, а не обычные свойства среды CLR, можно использовать в качестве триггеров свойств в стиле.
Создание настраиваемых свойств зависимостей только для чтения
Прежде чем создавать свойство зависимостей, доступное только для чтения, проверьте не применимые сценарии.
Процесс создания свойства зависимостей только для чтения во многом аналогичен созданию свойств зависимостей чтения и записи с этими различиями:
При регистрации свойства только для чтения вызовите RegisterReadOnly вместо Register.
При реализации оболочки свойств CLR убедитесь, что у неё нет публичного
setаксессора.RegisterReadOnlyвозвращает DependencyPropertyKey вместо DependencyProperty. СохранитеDependencyPropertyKeyв закрытом элементе класса.
Вы можете определить значение свойства зависимости, доступного только для чтения, используя любую логику по вашему выбору. Рекомендуемый способ задать значение свойства (изначально или как часть логики среды выполнения) — использовать перегрузку SetValue , которая принимает параметр типа DependencyPropertyKey. Использование SetValue предпочтительнее, чем обходить систему свойств и задавать вспомогательное поле напрямую.
Как и где вы задаете значение открытого только для чтения свойства зависимости в вашем приложении, это будет влиять на уровень доступа, который вы назначаете члену класса, в котором хранится DependencyPropertyKey. Если задать значение свойства только из класса, регистрирующего свойство зависимостей, можно использовать private модификатор доступа. В сценариях, когда значения свойств зависимостей влияют друг на друга, можно использовать парные PropertyChangedCallback и CoerceValueCallback обратные вызовы для активации изменений значений. Дополнительные сведения см. в разделе метаданных свойства зависимостей.
Если необходимо изменить значение свойства зависимости, доступного только для чтения, за пределами класса, который его регистрирует, можно использовать модификатор доступа internal для DependencyPropertyKey. Например, можно вызвать SetValue из обработчика событий в той же сборке. В следующем примере определяется класс Aquarium, который вызывает RegisterReadOnly, чтобы создать FishCount свойство зависимости только для чтения.
DependencyPropertyKey назначается полю internal static readonly, так что код в той же сборке может изменить значение свойства зависимости, доступного только для чтения.
public class Aquarium : DependencyObject
{
// Register a dependency property with the specified property name,
// property type, owner type, and property metadata.
// Assign DependencyPropertyKey to a nonpublic field.
internal static readonly DependencyPropertyKey FishCountPropertyKey =
DependencyProperty.RegisterReadOnly(
name: "FishCount",
propertyType: typeof(int),
ownerType: typeof(Aquarium),
typeMetadata: new FrameworkPropertyMetadata());
// Declare a public get accessor.
public int FishCount =>
(int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
Inherits DependencyObject
' Register a dependency property with the specified property name,
' property type, owner type, And property metadata.
' Assign DependencyPropertyKey to a nonpublic field.
Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
DependencyProperty.RegisterReadOnly(
name:="FishCount",
propertyType:=GetType(Integer),
ownerType:=GetType(Aquarium),
typeMetadata:=New FrameworkPropertyMetadata())
' Declare a public get accessor.
Public ReadOnly Property FishCount As Integer
Get
Return GetValue(FishCountPropertyKey.DependencyProperty)
End Get
End Property
End Class
Так как система свойств WPF не распространяет DependencyPropertyKey за пределы вашего кода, свойства зависимости только для чтения обладают лучшей защитой записи, чем свойства зависимости с возможностью чтения и записи. Используйте свойство зависимости только для чтения, если нужно ограничить доступ к записи для тех, у кого есть ссылка на DependencyPropertyKey.
В отличие от этого, идентификатор свойства зависимостей для свойств зависимостей чтения и записи доступен через систему свойств, независимо от того, какой модификатор доступа назначается. Для получения дополнительной информации см. раздел "Безопасность свойств зависимостей".
См. также
.NET Desktop feedback