Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Artykuł zakłada, że posiadasz podstawową wiedzę na temat właściwości zależności i że przeczytałeś Omówienie 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 przekazują stan i nie powinny być modyfikowalne za pomocą public akcesora. 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ą akcesora public, wiele istniejących właściwości zależności tylko do odczytu ma wartości określane przez wiele danych wejściowych.
Użycie właściwości zależności tylko do odczytu
Właściwości zależności w trybie tylko do odczytu nie mają zastosowania w kilku sytuacjach, w których zwykle właściwości zależności 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 o dostępie 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 w właściwościach zależności tylko do odczytu, wspierając tym samym funkcję 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 / Notatka
Tylko właściwości zależności, a nie standardowe właściwości CLR, 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 akcesora.
RegisterReadOnlyzwraca DependencyPropertyKey zamiast DependencyProperty. Zapisz elementDependencyPropertyKeyw 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. Użycie SetValue jest preferowane zamiast obchodzenia systemu właściwości i bezpośredniego ustawiania pola zapasowego.
Jak i gdzie ustawisz wartość właściwości tylko do odczytu zależności w aplikacji, wpłynie na poziom dostępu przypisany do składowej klasy, która przechowuje DependencyPropertyKey. 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 z programu 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 FishCountzależności tylko do odczytu .
DependencyPropertyKey jest przypisana do pola internal static readonly, aby kod w tym samym zestawie mógł zmienić wartość jednokierunkowej właściwości zależności.
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 do 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 dependency property security.
Zobacz także
- Właściwości zależności — omówienie
- Zaimplementować właściwość zależności
- Niestandardowe właściwości zależności
- właściwości zależności typu zbiorczego
- zabezpieczenia właściwości zależności
- Style i szablony w WPF
.NET Desktop feedback