Właściwości zależności tylko do odczytu (WPF .NET)
Właściwości zależności tylko do odczytu umożliwiają zapobieganie ustawianiu wartości właściwości spoza kodu. W tym artykule omówiono istniejące właściwości zależności tylko do odczytu oraz scenariusze i techniki tworzenia niestandardowej właściwości zależności tylko do odczytu.
Wymagania wstępne
W tym artykule przyjęto założenie, że masz podstawową wiedzę na temat właściwości zależności i zapoznasz się z omówieniem właściwości zależności. Aby postępować zgodnie z przykładami w tym artykule, warto zapoznać się z językiem Extensible Application Markup Language (XAML) i wiedzieć, jak pisać aplikacje WPF.
Istniejące właściwości zależności tylko do odczytu
Właściwości zależności tylko do odczytu zwykle zgłaszają stan i nie powinny być modyfikowalne za pomocą public
metody dostępu. Na przykład struktura Windows Presentation Foundation (WPF) implementuje IsMouseOver właściwość jako tylko do odczytu, ponieważ jej wartość powinna być określana tylko przez dane wejściowe myszy. Jeśli IsMouseOver
są dozwolone inne dane wejściowe, jego wartość może stać się niespójna z danymi wejściowymi myszy. Chociaż nie można ustawić za pomocą public
metody dostępu, wiele istniejących właściwości zależności tylko do odczytu ma wartości określone przez wiele danych wejściowych.
Użycie właściwości zależności tylko do odczytu
Właściwości zależności tylko do odczytu nie mają zastosowania w kilku scenariuszach, w których właściwości zależności zwykle oferują rozwiązanie. Scenariusze, które nie mają zastosowania, obejmują powiązanie danych, zastosowanie stylu do wartości, walidacji, animacji i dziedziczenia. Jednak właściwość zależności tylko do odczytu może być używana jako wyzwalacz właściwości w stylu. Na przykład IsMouseOver jest często używany do wyzwalania zmian w tle, na pierwszym planie lub innej widocznej właściwości kontrolki, gdy na niej znajduje się mysz. System właściwości WPF wykrywa i zgłasza zmiany we właściwościach zależności tylko do odczytu, co powoduje obsługę funkcji wyzwalacza właściwości. Właściwości zależności tylko do odczytu są również przydatne podczas implementowania właściwości zależności typu kolekcji, gdzie tylko elementy kolekcji muszą być zapisywalne, a nie sam obiekt kolekcji. Aby uzyskać więcej informacji, zobacz Właściwości zależności typu kolekcji.
Uwaga
Tylko właściwości zależności, a nie zwykłe właściwości środowiska uruchomieniowego języka wspólnego, mogą być używane jako wyzwalacze właściwości w stylu.
Tworzenie niestandardowych właściwości zależności tylko do odczytu
Przed utworzeniem właściwości zależności, która jest tylko do odczytu, sprawdź scenariusze, które nie mają zastosowania.
Proces tworzenia właściwości zależności tylko do odczytu jest na wiele sposobów podobny do tworzenia właściwości zależności odczytu i zapisu, z następującymi różnicami:
Podczas rejestrowania właściwości tylko do odczytu wywołaj metodę RegisterReadOnly zamiast Register.
Podczas implementowania otoki właściwości CLR upewnij się, że nie ma ona publicznego
set
dostępu.RegisterReadOnly
funkcja zwraca DependencyPropertyKey wartość zamiast DependencyProperty. Zapisz elementDependencyPropertyKey
w niepublicowym elemencie członkowskim klasy.
Możesz określić wartość właściwości zależności tylko do odczytu przy użyciu dowolnej wybranej logiki. Zalecanym sposobem ustawienia wartości właściwości , początkowo lub w ramach logiki środowiska uruchomieniowego, jest użycie przeciążenia SetValue , które akceptuje parametr typu DependencyPropertyKey
. Preferowane SetValue
jest obejście systemu właściwości i bezpośrednie ustawienie pola zapasowego.
Jak i gdzie ustawisz wartość właściwości zależności tylko do odczytu w aplikacji wpłynie na poziom dostępu przypisany do składowej klasy, która przechowuje DependencyPropertyKey
element . Jeśli ustawisz tylko wartość właściwości z klasy, która rejestruje właściwość zależności, możesz użyć private
modyfikatora dostępu. W scenariuszach, w których wartości właściwości zależności wpływają na siebie nawzajem, można użyć parowanych PropertyChangedCallback i CoerceValueCallback wywołań zwrotnych, aby wyzwolić zmiany wartości. Aby uzyskać więcej informacji, zobacz Metadane właściwości zależności.
Jeśli musisz zmienić wartość właściwości zależności tylko do odczytu spoza klasy, która ją rejestruje, możesz użyć internal
modyfikatora dostępu dla klasy DependencyPropertyKey
. Można na przykład wywołać SetValue
program obsługi zdarzeń w tym samym zestawie. W poniższym przykładzie zdefiniowano klasę Aquarium, która wywołuje RegisterReadOnly
metodę w celu utworzenia właściwości FishCount
zależności tylko do odczytu . Właściwość jest przypisana DependencyPropertyKey
do internal static readonly
pola, aby kod w tym samym zestawie mógł zmienić wartość właściwości zależności tylko do odczytu.
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
Ponieważ system właściwości WPF nie propaguje DependencyPropertyKey poza kodem, właściwości zależności tylko do odczytu mają lepsze zabezpieczenia zapisu niż właściwości zależności odczytu i zapisu. Użyj właściwości zależności tylko do odczytu, jeśli chcesz ograniczyć dostęp do zapisu do tych, którzy mają odwołanie do obiektu DependencyPropertyKey
.
Z kolei identyfikator właściwości zależności dla właściwości zależności odczytu i zapisu jest dostępny za pośrednictwem systemu właściwości, niezależnie od tego, jaki modyfikator dostępu go przypiszesz. Aby uzyskać więcej informacji, zobacz Zabezpieczenia właściwości zależności.
Zobacz też
.NET Desktop feedback