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.

Ważne

Dokumentacja przewodnika dla komputerów dla platform .NET 7 i .NET 6 jest w budowie.

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 element DependencyPropertyKey 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 DependencyPropertyKeyelement . 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 FishCountzależ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ż