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žteDependencyPropertyKey
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é
- Přehled vlastností závislostí
- Implementace vlastnosti závislosti
- Vlastní závislostní vlastnosti
- Závislostní vlastnosti typu kolekce
- zabezpečení vlastností závislostí
- Styly a šablony v WPF
.NET Desktop feedback