Írásvédett függőség tulajdonságai

Írásvédett függőségi tulajdonságok használatával megakadályozhatja, hogy a tulajdonságértékeket külső kód módosítsa. Ez a cikk a meglévő írásvédett függőségi tulajdonságokat, valamint az egyéni írásvédett függőségi tulajdonságok létrehozásának forgatókönyveit és technikáit tárgyalja.

Előfeltételek

A cikk feltételezi a függőségi tulajdonságok alapszintű ismeretét, és hogy elolvasta függőségi tulajdonságok áttekintését. A cikkben szereplő példák követéséhez segít, ha ismeri az Extensible Application Markup Language (XAML) nyelvet, és ismeri a WPF-alkalmazások írásának módját.

Meglévő írásvédett függőségi tulajdonságok

A csak olvasható függőségi tulajdonságok általában az állapotot jelentik, és nem módosíthatók egy public tartozékon keresztül. A Windows Presentation Foundation (WPF) keretrendszer például írásvédettként implementálja a IsMouseOver tulajdonságot, mert értékét csak az egér bemenete határozza meg. Ha IsMouseOver más bemeneteket is engedélyezett, az értéke inkonzisztenssé válhat az egérbemenettel. Bár nem állítható be egy public hozzáférési ponton keresztül, számos meglévő írásvédett függőségi tulajdonság van, amelynek értékét több bemenet határozza meg.

Írásvédett függőségi tulajdonságok használata

A csak olvasható függőségi tulajdonságok nem alkalmazhatók olyan helyzetekben, ahol a függőségi tulajdonságok általában megoldást kínálnak. A nem alkalmazható forgatókönyvek közé tartozik az adatkötés, a stílus értékre való alkalmazása, az ellenőrzés, az animáció és az öröklés. Azonban egy írásvédett függőségi tulajdonság használható tulajdonságindítóként egy stílusban. A IsMouseOver például gyakran használják a vezérlőelem hátterének, előterének vagy más látható tulajdonságának módosítására, amikor az egér rajta van. A WPF tulajdonságrendszer észleli és jelenti az írásvédett függőségi tulajdonságok változásait, ezáltal támogatja a tulajdonságok kioldási funkcióját. Az írásvédett függőségi tulajdonságok akkor is hasznosak, ha gyűjtemény típusú függőségi tulajdonságot alakítanak ki, ahol csak a gyűjtemény elemei módosíthatók, nem maga a gyűjteményobjektum. További információ: Gyűjtemény típusú függőség tulajdonságai.

Megjegyzés:

Stílusban csak a függőségi tulajdonságok használhatók tulajdonságindítóként, nem pedig a szokásos közös nyelvi futtatókörnyezeti tulajdonságok.

Egyéni írásvédett függőségi tulajdonságok létrehozása

Mielőtt létrehozna egy írásvédett függőségi tulajdonságot, ellenőrizze a nem alkalmazható helyzeteket.

Az írásvédett függőségi tulajdonság létrehozásának folyamata számos tekintetben hasonlít az olvasás-írás függőségi tulajdonságok létrehozásához, az alábbi különbségekkel:

  • Az írásvédett tulajdonság regisztrálásakor hívja meg a RegisterReadOnly-t Registerhelyett.

  • A CLR tulajdonságburkoló megvalósításakor győződjön meg arról, hogy nincs nyilvános set tartozéka.

  • RegisterReadOnly DependencyPropertyKeyhelyett DependencyProperty ad vissza. A DependencyPropertyKey-t tárolja egy nem nyilvános osztálytagban.

Az írásvédett függőségi tulajdonság értékét tetszőleges logikával meghatározhatja. A tulajdonságérték kezdeti vagy futtatókörnyezeti logika részeként történő beállításának ajánlott módja a SetValue túlterhelése, amely elfogadja a DependencyPropertyKeytípusú paramétert. A SetValue használata előnyösebb, mint a tulajdonságrendszer megkerülése és a háttérmező közvetlen beállítása.

Az alkalmazáson belüli írásvédett függőségi tulajdonság értékének beállítása befolyásolja a DependencyPropertyKeytároló osztálytaghoz hozzárendelt hozzáférési szintet. Ha csak a függőségi tulajdonságot regisztráló osztályból állítja be a tulajdonságértéket, használhat egy private hozzáférés-módosítót. Olyan helyzetekben, amikor a függőségi tulajdonságok értékei hatással vannak egymásra, párosított PropertyChangedCallback és CoerceValueCallback visszahívásokkal aktiválhatja az értékváltozásokat. További információ: Függőség tulajdonság metaadatai.

Ha módosítania kell egy írásvédett függőségi tulajdonság értékét a regisztráló osztályon kívülről, használhatja a internal hozzáférési módosítót a DependencyPropertyKeyszámára. Meghívhat például SetValue-t egy eseménykezelőből ugyanabban az assemblyben. Az alábbi példa egy akváriumosztályt határoz meg, amely meghívja RegisterReadOnly a csak olvasható függőségi tulajdonság FishCountlétrehozásához. A DependencyPropertyKey egy internal static readonly mezőhöz van rendelve, hogy az ugyanabban az összeállításban lévő kód módosíthassa az írásvédett függőségi tulajdonság értékét.

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

Mivel a WPF tulajdonságrendszer nem propagálja a DependencyPropertyKey a kódon kívül, az írásvédett függőségi tulajdonságok írási biztonsága jobb, mint az írási-írási függőségi tulajdonságok. Írásvédett függőségi tulajdonságot akkor használjon, ha korlátozni szeretné az írási hozzáférést azoknak, akik hivatkoznak a DependencyPropertyKey.

Ezzel szemben az olvasási-írási függőségi tulajdonságok függőségi tulajdonságazonosítója a tulajdonságrendszeren keresztül érhető el, függetlenül attól, hogy milyen hozzáférés-módosítóként rendeli hozzá. További információért lásd: Függőségi tulajdonság biztonsága.

Lásd még