Sdílet prostřednictvím


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í.

Požadavky

Článek 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í pouze pro čtení obvykle ohlašují stav a neměly by být měnitelné prostřednictvím public přístupové metody. Například architektura Windows Presentation Foundation (WPF) implementuje vlastnost IsMouseOver jen pro čtení, protože její hodnota by měla být určena pouze vstupem myši. Pokud by IsMouseOver umožňovalo jiné vstupy, mohla by se jeho hodnota stát nesourodou se vstupem myši. I když není možné nastavit 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. Například IsMouseOver se běžně 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 v jen pro čtení závislých vlastnostech, čímž podporuje funkcionalitu spouštěče 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 závislostních vlastností jen pro čtení

Před vytvořením vlastnosti závislosti, která je 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:

  • Místo Registervolejte při registraci vlastnosti jen pro čtení RegisterReadOnly.

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

  • RegisterReadOnly místo DependencyPropertyvrátí DependencyPropertyKey . Uložte DependencyPropertyKey do nesoukromého atributu 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, ať už na začátku nebo jako součást logiky za běhu, je použít přetíženou funkci SetValue přijímající parametr typu DependencyPropertyKey. Použití SetValue je vhodnější než obcházet systém vlastností a nastavovat podpůrné 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ávislostí, můžete použít private modifikátor přístupu. Ve scénářích, kdy hodnoty vlastností závislostí ovlivňují navzájem, můžete použít spárované PropertyChangedCallback a CoerceValueCallback zpětné volání k aktivaci změn hodnot. 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 internal pro DependencyPropertyKey. Můžete například volat SetValue z obslužné rutiny události ve stejném projektovém sestavení. Následující příklad definuje třídu Aquarium, která volá RegisterReadOnly, aby vytvořila vlastnost závislosti pouze pro čtení FishCount. DependencyPropertyKey je přiřazeno k poli internal static readonly, 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 nerozšíří 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. Použijte závislostní vlastnost jen pro čtení, pokud chcete vyhradit možnost zápisu pouze pro ty, kteří mají odkaz na DependencyPropertyKey.

Naproti tomu je identifikátor vlastnosti závislé na zápisu a čtení přístupný vlastnostním systémem, bez ohledu na to, jaký modifikátor přístupu mu přiřadíte. Další informace naleznete v tématu zabezpečení vlastností závislostí.

Viz také