Vlastnosti závislostí jen pro čtení (WPF .NET)

Pomocí vlastností závislostí jen pro čtení můžete zabránit nastavení hodnot vlastností mimo váš kód. Tento článek popisuje existující vlastnosti závislostí jen pro čtení a scénáře a techniky pro vytvoření vlastní vlastnosti závislosti jen pro čtení.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Předpoklady

V článku se předpokládá základní znalost vlastností závislostí a že jste si přečetli přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WPF.

Existující vlastnosti závislosti jen pro čtení

Vlastnosti závislostí jen pro čtení obvykle stav sestavy a neměly by být modifikovatelné prostřednictvím přístupového objektu public . Například architektura Windows Presentation Foundation (WPF) implementuje IsMouseOver vlastnost jen pro čtení, protože její hodnota by měla být určena pouze vstupem myši. Pokud IsMouseOver jsou povoleny jiné vstupy, může být jeho hodnota nekonzistentní se vstupem myši. I když není nastaveno prostřednictvím přístupového objektu public , mnoho existujících vlastností závislostí jen pro čtení má hodnoty určené více vstupy.

Použití vlastností závislostí jen pro čtení

Vlastnosti závislostí jen pro čtení nejsou použitelné v několika scénářích, kdy vlastnosti závislostí obvykle nabízejí řešení. Mezi nepoužitelné scénáře patří datová vazba, použití stylu na hodnotu, ověření, animaci a dědičnost. Vlastnost závislosti jen pro čtení se ale dá použít jako aktivační událost vlastnosti ve stylu. Běžně se například IsMouseOver používá k aktivaci změn pozadí, popředí nebo jiné viditelné vlastnosti ovládacího prvku, když je nad ním myš. Systém vlastností WPF detekuje a hlásí změny ve vlastnostech závislostí jen pro čtení, a proto podporuje funkce triggeru vlastností. Vlastnosti závislostí jen pro čtení jsou také užitečné při implementaci vlastnosti závislosti typu kolekce, kde pouze prvky kolekce musí být zapisovatelné, nikoli samotný objekt kolekce. Další informace naleznete v tématu Vlastnosti závislostí typu kolekce.

Poznámka:

Jako triggery vlastností ve stylu lze použít pouze vlastnosti závislosti, ne běžné vlastnosti modulu runtime jazyka.

Vytváření vlastních vlastností závislostí jen pro čtení

Před vytvořením vlastnosti závislosti, která je určena jen pro čtení, zkontrolujte nepoužitelné scénáře.

Proces vytváření vlastnosti závislosti jen pro čtení je mnoha způsoby podobný vytváření vlastností závislostí pro čtení i zápis s těmito rozdíly:

  • Při registraci vlastnosti jen pro čtení místo volání RegisterReadOnlyRegister.

  • Při implementaci obálky vlastností CLR se ujistěte, že nemá veřejný set přístup.

  • RegisterReadOnly vrátí DependencyPropertyKey místo DependencyProperty. Uložte soubor DependencyPropertyKey v nepublikovém členu třídy.

Hodnotu vlastnosti závislosti jen pro čtení můžete určit pomocí libovolné logiky, kterou zvolíte. Doporučeným způsobem, jak nastavit hodnotu vlastnosti, buď původně, nebo jako součást logiky modulu runtime, je použít přetížení SetValue , které přijímá parametr typu DependencyPropertyKey. Použití SetValue je vhodnější obejít systém vlastností a nastavit backingové pole přímo.

Jak a kde nastavíte hodnotu vlastnosti závislosti jen pro čtení v rámci vaší aplikace ovlivní úroveň přístupu, kterou přiřadíte členu třídy, který ukládá DependencyPropertyKey. Pokud nastavíte pouze hodnotu vlastnosti z třídy, která registruje vlastnost závislosti, můžete použít private modifikátor přístupu. Ve scénářích, ve kterých se hodnoty vlastností závislostí vzájemně ovlivňují, můžete k aktivaci změn hodnot použít spárované PropertyChangedCallback a CoerceValueCallback zpětné volání. Další informace naleznete v tématu Metadata vlastností závislostí.

Pokud potřebujete změnit hodnotu vlastnosti závislosti jen pro čtení mimo třídu, která ji registruje, můžete použít modifikátor přístupu pro danou internalDependencyPropertyKeytřídu . Můžete například volat SetValue z obslužné rutiny události ve stejném sestavení. Následující příklad definuje aquarium třída, která volá RegisterReadOnly vytvořit jen pro čtení závislost vlastnost FishCount. Je DependencyPropertyKey přiřazen k internal static readonly poli, aby kód ve stejném sestavení mohl změnit hodnotu vlastnosti závislosti jen pro čtení.

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

Vzhledem k tomu, že systém vlastností WPF nešíří DependencyPropertyKey mimo váš kód, vlastnosti závislostí jen pro čtení mají lepší zabezpečení zápisu než vlastnosti závislostí pro čtení i zápis. Vlastnost závislosti jen pro čtení použijte, pokud chcete omezit přístup k zápisu na uživatele, kteří mají odkaz na objekt DependencyPropertyKey.

Naproti tomu identifikátor vlastnosti závislosti pro čtení a zápis vlastností je přístupný prostřednictvím systému vlastností bez ohledu na to, jaký modifikátor přístupu přiřadíte. Další informace naleznete v tématu Zabezpečení vlastností závislostí.

Viz také