Información general sobre las propiedades de dependenciaDependency properties overview

Windows Presentation Foundation (WPF) proporciona un conjunto de servicios que se pueden usar para ampliar la funcionalidad de la propiedad de un tipo.Windows Presentation Foundation (WPF) provides a set of services that can be used to extend the functionality of a type's property. Colectivamente, se suele hacer referencia a estos servicios como el sistema de propiedades de WPF.Collectively, these services are typically referred to as the WPF property system. Una propiedad respaldada por el sistema de propiedades de WPF se conoce como una propiedad de dependencia.A property that is backed by the WPF property system is known as a dependency property. En esta información general se describe el sistema de propiedades de WPF y las funcionalidades de una propiedad de dependencia.This overview describes the WPF property system and the capabilities of a dependency property. Esto incluye cómo usar las propiedades de dependencia existentes en XAML y en el código.This includes how to use existing dependency properties in XAML and in code. Esta información general también presenta aspectos especializados de las propiedades de dependencia, como los metadatos de las propiedades de dependencia y el proceso de creación de una propiedad de dependencia propia en una clase personalizada.This overview also introduces specialized aspects of dependency properties, such as dependency property metadata, and how to create your own dependency property in a custom class.

Requisitos previosPrerequisites

En este tema se supone que tiene conocimientos básicos sobre el sistema de tipos de .NET y la programación orientada a objetos.This topic assumes that you have some basic knowledge of the .NET type system and object-oriented programming. Para seguir los ejemplos de este tema, también debe comprender el lenguaje XAML y saber cómo escribir aplicaciones de WPF.In order to follow the examples in this topic, you should also understand XAML and know how to write WPF applications. Para obtener más información, vea Tutorial: Mi primera aplicación de escritorio de WPF.For more information, see Walkthrough: My first WPF desktop application.

Propiedades de dependencia y propiedades CLRDependency properties and CLR properties

En WPF, las propiedades se suelen exponer como propiedades estándar de .NET.In WPF, properties are typically exposed as standard .NET properties. En un nivel básico, podría interactuar directamente con estas propiedades y no llegar a saber que están implementadas como una propiedad de dependencia.At a basic level, you could interact with these properties directly and never know that they are implemented as a dependency property. Pero debería familiarizarse con todas o algunas de las características del sistema de propiedades de WPF, a fin de poder aprovechar estas características.However, you should become familiar with some or all of the features of the WPF property system, so that you can take advantage of these features.

El propósito de las propiedades de dependencia es proporcionar una manera de calcular el valor de una propiedad en función del valor de otras entradas.The purpose of dependency properties is to provide a way to compute the value of a property based on the value of other inputs. Estas otras entradas pueden incluir propiedades del sistema, tales como temas y preferencias del usuario, mecanismos de determinación de propiedades Just-In-Time como el enlace de datos y las animaciones o los guiones gráficos, plantillas de usos múltiples como recursos y estilos, o valores conocidos a través de relaciones primario-secundario con otros elementos del árbol de elementos.These other inputs might include system properties such as themes and user preference, just-in-time property determination mechanisms such as data binding and animations/storyboards, multiple-use templates such as resources and styles, or values known through parent-child relationships with other elements in the element tree. Además, una propiedad de dependencia se puede implementar para proporcionar una validación autocontenida, valores predeterminados, devoluciones de llamada que controlen los cambios en otras propiedades y un sistema que pueda forzar los valores de propiedad de acuerdo con la información de tiempo de ejecución en potencia.In addition, a dependency property can be implemented to provide self-contained validation, default values, callbacks that monitor changes to other properties, and a system that can coerce property values based on potentially runtime information. Las clases derivadas también pueden cambiar algunas características concretas de una propiedad existente mediante la invalidación de los metadatos de la propiedad de dependencia, en lugar de invalidar la implementación real de las propiedades existentes o de crear nuevas propiedades.Derived classes can also change some specific characteristics of an existing property by overriding dependency property metadata, rather than overriding the actual implementation of existing properties or creating new properties.

En la referencia del SDK, puede identificar qué propiedad es una propiedad de dependencia por la presencia de la sección de información de la propiedad de dependencia en la página de referencia administrada de esa propiedad.In the SDK reference, you can identify which property is a dependency property by the presence of the Dependency Property Information section on the managed reference page for that property. En la sección de información de las propiedades de dependencia se incluye un vínculo al campo de identificador DependencyProperty de esa propiedad de dependencia, así como una lista de las opciones de metadatos establecidas para esa propiedad, información de invalidación por clases y otros detalles.The Dependency Property Information section includes a link to the DependencyProperty identifier field for that dependency property, and also includes a list of the metadata options that are set for that property, per-class override information, and other details.

Las propiedades de dependencia respaldan las propiedades CLRDependency properties back CLR properties

Las propiedades de dependencia y el sistema de propiedades de WPF extienden la funcionalidad de las propiedades al proporcionar un tipo que respalda una propiedad, como una implementación alternativa al patrón estándar de respaldar la propiedad con un campo privado.Dependency properties and the WPF property system extend property functionality by providing a type that backs a property, as an alternative implementation to the standard pattern of backing the property with a private field. El nombre de este tipo es DependencyProperty.The name of this type is DependencyProperty. El otro tipo importante que define el sistema de propiedades de WPF es DependencyObject.The other important type that defines the WPF property system is DependencyObject. DependencyObject define la clase base que puede registrar y poseer una propiedad de dependencia.DependencyObject defines the base class that can register and own a dependency property.

A continuación se enumera la terminología que se usa con las propiedades de dependencia:The following lists the terminology that is used with dependency properties:

  • Propiedad de dependencia: Una propiedad que está respaldada por un DependencyProperty.Dependency property: A property that is backed by a DependencyProperty.

  • Identificador de propiedad de dependencia: Un DependencyProperty instancia, que se obtiene como un valor devuelto al registrar una propiedad de dependencia y, a continuación, se almacena como un miembro estático de una clase.Dependency property identifier: A DependencyProperty instance, which is obtained as a return value when registering a dependency property, and then stored as a static member of a class. Este identificador se usa como un parámetro para muchas de las API que interactúan con el sistema de propiedades de WPF.This identifier is used as a parameter for many of the APIs that interact with the WPF property system.

  • CLR "wrapper": Real obtener y establece las implementaciones de la propiedad.CLR "wrapper": The actual get and set implementations for the property. Estas implementaciones incorporan el identificador de la propiedad de dependencia usándolo en las llamadas a GetValue y SetValue, proporcionando así el respaldo para la propiedad que usa el sistema de propiedades WPF.These implementations incorporate the dependency property identifier by using it in the GetValue and SetValue calls, thus providing the backing for the property using the WPF property system.

En el ejemplo siguiente se define la propiedad de dependencia IsSpinning y se muestra la relación del identificador DependencyProperty con la propiedad que respalda.The following example defines the IsSpinning dependency property, and shows the relationship of the DependencyProperty identifier to the property that it backs.

public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(MyCode)
    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}
Public Shared ReadOnly IsSpinningProperty As DependencyProperty =
    DependencyProperty.Register("IsSpinning",
                                GetType(Boolean),
                                GetType(MyCode))

Public Property IsSpinning() As Boolean
    Get
        Return CBool(GetValue(IsSpinningProperty))
    End Get
    Set(ByVal value As Boolean)
        SetValue(IsSpinningProperty, value)
    End Set
End Property

La convención de nomenclatura de la propiedad y su campo de respaldo DependencyProperty es importante.The naming convention of the property and its backing DependencyProperty field is important. El nombre del campo siempre es el nombre de la propiedad, con el sufijo Property anexado.The name of the field is always the name of the property, with the suffix Property appended. Para obtener más información acerca de esta convención y las razones para usarla, consulte Propiedades de dependencia personalizadas.For more information about this convention and the reasons for it, see Custom Dependency Properties.

Establecimiento de valores de propiedadSetting property values

Puede establecer propiedades en el código o en XAML.You can set properties either in code or in XAML.

Establecimiento de valores de propiedad en XAMLSetting property values in XAML

El siguiente ejemplo de XAML especifica el color de fondo de un botón como rojo.The following XAML example specifies the background color of a button as red. En este ejemplo se muestra un caso donde el analizador de XAML de WPF convirtió el tipo del valor de cadena simple de un atributo XAML en un tipo WPF (Color, por medio de SolidColorBrush) en el código generado.This example illustrates a case where the simple string value for a XAML attribute is type-converted by the WPF XAML parser into a WPF type (a Color, by way of a SolidColorBrush) in the generated code.

<Button Background="Red" Content="Button!"/>

XAML admite una variedad de formatos de sintaxis para establecer propiedades.XAML supports a variety of syntax forms for setting properties. La sintaxis que se debe usar para una propiedad determinada dependerá del tipo de valor que use la propiedad, así como de otros factores, tal como la presencia de un convertidor de tipos.Which syntax to use for a particular property will depend on the value type that a property uses, as well as other factors such as the presence of a type converter. Para obtener más información sobre la sintaxis XAML y establecer propiedades, consulte Información general sobre XAML (WPF) y Detalles de la sintaxis XAML.For more information on XAML syntax for property setting, see XAML Overview (WPF) and XAML Syntax In Detail.

Como ejemplo de sintaxis sin atributos, en el ejemplo de XAML siguiente se muestra otro fondo de botón.As an example of non-attribute syntax, the following XAML example shows another button background. Esta vez, en lugar de establecer un color sólido simple, el fondo se establece en una imagen, con un elemento que representa esa imagen y el origen de la imagen especificado como un atributo del elemento anidado.This time rather than setting a simple solid color, the background is set to an image, with an element representing that image and the source of that image specified as an attribute of the nested element. Este es un ejemplo de sintaxis de elemento de propiedad.This is an example of property element syntax.

<Button Content="Button!">
  <Button.Background>
    <ImageBrush ImageSource="wavy.jpg"/>
  </Button.Background>
</Button>

Establecimiento de propiedades en el códigoSetting properties in code

Establecer valores de propiedad de dependencia en el código solo suele requerir una llamada a la implementación establecida que expone el "contenedor" de CLRCLR.Setting dependency property values in code is typically just a call to the set implementation exposed by the CLRCLR "wrapper".

Button myButton = new Button();
myButton.Width = 200.0;
Dim myButton As New Button()
myButton.Width = 200.0

Para obtener un valor de propiedad también se requiere esencialmente una llamada a la implementación de get del "contenedor":Getting a property value is also essentially a call to the get "wrapper" implementation:

double whatWidth;
whatWidth = myButton.Width;
Dim whatWidth As Double
whatWidth = myButton.Width

También se puede llamar directamente a las APIAPIs de sistema de propiedades GetValue y SetValue.You can also call the property system APIAPIs GetValue and SetValue directly. Generalmente, no es necesario si usa las propiedades existentes (los contenedores son más prácticos y ofrecen una mejor exposición de la propiedad para las herramientas de desarrollo), pero llamar a APIAPIs directamente es adecuado en determinados escenarios.This is not typically necessary if you are using existing properties (the wrappers are more convenient, and provide better exposure of the property for developer tools), but calling the APIAPIs directly is appropriate for certain scenarios.

Las propiedades también se pueden establecer en XAML y se puede acceder a ellas más adelante en el código a través del código subyacente.Properties can be also set in XAML and then accessed later in code, through code-behind. Para obtener información detallada, vea Código subyacente y XAML en WPF.For details, see Code-Behind and XAML in WPF.

Funcionalidad de propiedad proporcionada por una propiedad de dependenciaProperty functionality provided by a dependency property

Una propiedad de dependencia proporciona una funcionalidad que amplía la funcionalidad de una propiedad, al contrario que una propiedad respaldada por un campo.A dependency property provides functionality that extends the functionality of a property as opposed to a property that is backed by a field. A menudo, esta funcionalidad representa o admite una de las características específicas siguientes:Often, such functionality represents or supports one of the following specific features:

RecursosResources

Un valor de propiedad de dependencia se puede establecer mediante una referencia a un recurso.A dependency property value can be set by referencing a resource. Los recursos se especifican normalmente como el valor de propiedad Resources de un elemento de raíz de la página o de la aplicación (estas ubicaciones permiten un acceso más cómodo al recurso).Resources are typically specified as the Resources property value of a page root element, or of the application (these locations enable the most convenient access to the resource). En el ejemplo siguiente se muestra cómo definir un recurso SolidColorBrush.The following example shows how to define a SolidColorBrush resource.

<DockPanel.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>

Una vez que el recurso está definido, puede hacer referencia al recurso y usarlo para proporcionar un valor de propiedad:Once the resource is defined, you can reference the resource and use it to provide a property value:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

Se hace referencia a este recurso concreto como una Extensión de marcado DynamicResource (en XAML de WPF, puede usar una referencia a recursos estáticos o dinámicos).This particular resource is referenced as a DynamicResource Markup Extension (in WPF XAML, you can use either a static or dynamic resource reference). Para usar una referencia a recursos dinámicos, se debe establecer una propiedad de dependencia, que es específicamente el uso de referencias a recursos dinámicos que permite el sistema de propiedades de WPF.To use a dynamic resource reference, you must be setting to a dependency property, so it is specifically the dynamic resource reference usage that is enabled by the WPF property system. Para obtener más información, consulte Recursos XAML.For more information, see XAML Resources.

Nota

Los recursos se tratan como un valor local, lo que significa que si establece otro valor local, eliminará la referencia a los recursos.Resources are treated as a local value, which means that if you set another local value, you will eliminate the resource reference. Para obtener más información, consulte Prioridad de los valores de propiedades de dependencia.For more information, see Dependency Property Value Precedence.

Enlace de datosData binding

Una propiedad de dependencia puede hacer referencia a un valor mediante el enlace de datos.A dependency property can reference a value through data binding. El enlace de datos funciona mediante una sintaxis de extensión de marcado específica en XAML, o bien mediante el objeto Binding en el código.Data binding works through a specific markup extension syntax in XAML, or the Binding object in code. Con el enlace de datos, la determinación del valor de propiedad final se aplaza hasta el tiempo de ejecución, momento en el que se obtiene el valor de un origen de datos.With data binding, the final property value determination is deferred until run time, at which time the value is obtained from a data source.

En el ejemplo siguiente se establece la propiedad Content para un Button, mediante un enlace declarado en XAML.The following example sets the Content property for a Button, using a binding declared in XAML. El enlace usa un contexto de datos heredado y un origen de datos XmlDataProvider (no se muestra).The binding uses an inherited data context and an XmlDataProvider data source (not shown). El propio enlace especifica la propiedad de origen deseada mediante XPath en el origen de datos.The binding itself specifies the desired source property by XPath within the data source.

<Button Content="{Binding XPath=Team/@TeamName}"/>

Nota

Los enlaces se tratan como un valor local, lo que significa que si establece otro valor local, eliminará el enlace.Bindings are treated as a local value, which means that if you set another local value, you will eliminate the binding. Para obtener más información, consulte Prioridad de los valores de propiedades de dependencia.For details, see Dependency Property Value Precedence.

Las propiedades de dependencia, o bien la clase DependencyObject, no admiten de forma nativa INotifyPropertyChanged para fines de generación de notificaciones de cambios en el valor de propiedad de origen DependencyObject para las operaciones de enlace de datos.Dependency properties, or the DependencyObject class, do not natively support INotifyPropertyChanged for purposes of producing notifications of changes in DependencyObject source property value for data binding operations. Para obtener más información acerca de cómo crear propiedades para su uso en un enlace de datos capaz de notificar los cambios en un destino de enlace de datos, consulte Información general sobre el enlace de datos.For more information on how to create properties for use in data binding that can report changes to a data binding target, see Data Binding Overview.

EstilosStyles

Los estilos y las plantillas son dos de los principales escenarios que invitan a usar las propiedades de dependencia.Styles and templates are two of the chief motivating scenarios for using dependency properties. Los estilos son particularmente útiles para establecer las propiedades que definen la interfaz de usuario (UI)user interface (UI) de la aplicación.Styles are particularly useful for setting properties that define application interfaz de usuario (UI)user interface (UI). Los estilos se definen normalmente como recursos en XAML.Styles are typically defined as resources in XAML. Los estilos interactúan con el sistema de propiedades porque suelen contener "establecedores" para determinadas propiedades, así como "desencadenadores" que cambian un valor de propiedad según el valor en tiempo real de otra propiedad.Styles interact with the property system because they typically contain "setters" for particular properties, as well as "triggers" that change a property value based on the real-time value for another property.

En el ejemplo siguiente se crea un estilo muy simple (que se definiría dentro de un diccionario Resources, que no se muestra), y después se aplica ese estilo directamente a la propiedad Style de un Button.The following example creates a very simple style (which would be defined inside a Resources dictionary, not shown), then applies that style directly to the Style property for a Button. El establecedor dentro del estilo establece la propiedad Background de un Button con estilo en el color verde.The setter within the style sets the Background property for a styled Button to green.

<Style x:Key="GreenButtonStyle">
  <Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

Para obtener más información, consulte Aplicar estilos y plantillas.For more information, see Styling and Templating.

AnimacionesAnimations

Las propiedades de dependencia se pueden animar.Dependency properties can be animated. Cuando una animación está aplicada y en ejecución, el valor animado funciona con una precedencia más alta que cualquier otro valor (por ejemplo, un valor local) que tenga la propiedad.When an animation is applied and is running, the animated value operates at a higher precedence than any value (such as a local value) that the property otherwise has.

En el ejemplo siguiente se anima el atributo Background de una propiedad Button (técnicamente, se anima Background mediante la sintaxis de elemento de propiedad para especificar un SolidColorBrush en blanco para Background, y después la propiedad Color de ese SolidColorBrush es la que se anima directamente).The following example animates the Background on a Button property (technically, the Background is animated by using property element syntax to specify a blank SolidColorBrush as the Background, then the Color property of that SolidColorBrush is the property that is directly animated).

<Button>I am animated
  <Button.Background>
    <SolidColorBrush x:Name="AnimBrush"/>
  </Button.Background>
  <Button.Triggers>
    <EventTrigger RoutedEvent="Button.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation
            Storyboard.TargetName="AnimBrush" 
            Storyboard.TargetProperty="(SolidColorBrush.Color)"
            From="Red" To="Green" Duration="0:0:5" 
            AutoReverse="True" RepeatBehavior="Forever" />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Button.Triggers>
</Button>

Para obtener más información sobre la animación de propiedades, consulte Información general sobre animaciones e Información general sobre objetos Storyboard.For more information on animating properties, see Animation Overview and Storyboards Overview.

Invalidaciones de metadatosMetadata overrides

Puede cambiar ciertos comportamientos de una propiedad de dependencia mediante la invalidación de los metadatos de la propiedad cuando se deriva de la clase que originalmente registra la propiedad de dependencia.You can change certain behaviors of a dependency property by overriding the metadata for that property when you derive from the class that originally registers the dependency property. La invalidación de metadatos se basa en el identificador DependencyProperty.Overriding metadata relies on the DependencyProperty identifier. Para invalidar los metadatos no es necesario volver a implementar la propiedad.Overriding metadata does not require re-implementing the property. El sistema de propiedades controla de forma nativa el cambio en los metadatos; cada clase puede contener metadatos individuales de todas las propiedades que se heredan de las clases base, por tipo.The metadata change is handled natively by the property system; each class potentially holds individual metadata for all properties that are inherited from base classes, on a per-type basis.

En el ejemplo siguiente se invalidan los metadatos para una propiedad de dependencia DefaultStyleKey.The following example overrides metadata for a dependency property DefaultStyleKey. La invalidación de los metadatos de esta propiedad de dependencia concreta forma parte de un patrón de implementación que crea controles que pueden usar estilos predeterminados de temas.Overriding this particular dependency property metadata is part of an implementation pattern that creates controls that can use default styles from themes.

public class SpinnerControl : ItemsControl
{
    static SpinnerControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SpinnerControl), 
            new FrameworkPropertyMetadata(typeof(SpinnerControl))
        );
    }
}
Public Class SpinnerControl
    Inherits ItemsControl
    Shared Sub New()
        DefaultStyleKeyProperty.OverrideMetadata(GetType(SpinnerControl), New FrameworkPropertyMetadata(GetType(SpinnerControl)))
    End Sub
End Class

Para obtener más información sobre cómo invalidar u obtener los metadatos de las propiedades, consulte Metadatos de las propiedades de dependencia.For more information about overriding or obtaining property metadata, see Dependency Property Metadata.

Herencia de valores de propiedadProperty value inheritance

Un elemento puede heredar el valor de una propiedad de dependencia de su elemento primario en el árbol de objetos.An element can inherit the value of a dependency property from its parent in the object tree.

Nota

El comportamiento de la herencia de valores de propiedad no está habilitado globalmente para todas las propiedades de dependencia, porque el tiempo de cálculo de la herencia afecta de algún modo al rendimiento.Property value inheritance behavior is not globally enabled for all dependency properties, because the calculation time for inheritance does have some performance impact. La herencia de valores de propiedad suele habilitarse normalmente solo para las propiedades donde un escenario determinado sugiere que dicha herencia es adecuada.Property value inheritance is typically only enabled for properties where a particular scenario suggests that property value inheritance is appropriate. Para determinar si una propiedad de dependencia se hereda, puede consultar la sección de información sobre las propiedades de dependencia correspondiente a esa propiedad de dependencia en la referencia del SDK.You can determine whether a dependency property inherits by looking at the Dependency Property Information section for that dependency property in the SDK reference.

En el ejemplo siguiente se muestra un enlace y se establece la propiedad DataContext que especifica el origen del enlace, que no se mostró en el ejemplo del enlace anterior.The following example shows a binding, and sets the DataContext property that specifies the source of the binding, which was not shown in the earlier binding example. No es necesario que los enlaces siguientes en los objetos secundarios especifiquen el origen; pueden usar el valor heredado de DataContext en el objeto StackPanel primario.Any subsequent bindings in child objects do not need to specify the source, they can use the inherited value from DataContext in the parent StackPanel object. (Como alternativa, un objeto secundario podría especificar directamente su propio DataContext o un Source en Binding, y no usar deliberadamente el valor heredado para el contexto de datos de sus enlaces).(Alternatively, a child object could instead choose to directly specify its own DataContext or a Source in the Binding, and to deliberately not use the inherited value for data context of its bindings.)

<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
  <Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

Para más información, vea Herencia de valores de propiedad.For more information, see Property Value Inheritance.

Integración de WPF DesignerWPF designer integration

Un control personalizado con propiedades que se implementan como propiedades de dependencia recibirá soporte técnico adecuado de WPF Designer para Visual StudioWPF Designer for Visual Studio.A custom control with properties that are implemented as dependency properties will receive appropriate WPF Designer para Visual StudioWPF Designer for Visual Studio support. Un ejemplo es la capacidad de editar las propiedades de dependencia directas y adjuntas con la ventana Propiedades.One example is the ability to edit direct and attached dependency properties with the Properties window. Para obtener más información, consulte Información general sobre la creación de controles.For more information, see Control Authoring Overview.

Prioridad de los valores de propiedades de dependenciaDependency property value precedence

Cuando se obtiene el valor de una propiedad de dependencia, potencialmente se está obteniendo un valor establecido en esa propiedad mediante cualquiera de las otras entradas basadas en propiedades que se incluyen en el sistema de propiedades de WPF.When you get the value of a dependency property, you are potentially obtaining a value that was set on that property through any one of the other property-based inputs that participate in the WPF property system. La precedencia de los valores de propiedad de dependencia existe para que distintos escenarios sobre cómo las propiedades obtienen sus valores puedan interactuar de forma predecible.Dependency property value precedence exists so that a variety of scenarios for how properties obtain their values can interact in a predictable way.

Considere el ejemplo siguiente.Consider the following example. El ejemplo incluye un estilo que se aplica a todos los botones y sus propiedades Background, pero después también especifica un botón con un valor Background establecido localmente.The example includes a style that applies to all buttons and their Background properties, but then also specifies one button with a locally set Background value.

Nota

La documentación del SDK usa los términos "valor local" o "valor establecido localmente" ocasionalmente al hablar de las propiedades de dependencia.The SDK documentation uses the terms "local value" or "locally set value" occasionally when discussing dependency properties. Un valor establecido localmente es un valor de propiedad que se establece directamente en una instancia de objeto en el código, o bien como un atributo en un elemento en XAML.A locally set value is a property value that is set directly on an object instance in code, or as an attribute on an element in XAML.

En principio, para el primer botón, la propiedad se establece dos veces, pero se aplica solo un valor: el valor con la precedencia más alta.In principle, for the first button, the property is set twice, but only one value applies: the value with the highest precedence. Un valor establecido localmente tiene la precedencia más alta (excepto para una animación en ejecución, pero ninguna animación es aplicable en este ejemplo) y, por tanto, el valor establecido localmente se usa en lugar del valor del establecedor de estilo para el fondo del primer botón.A locally set value has the highest precedence (except for a running animation, but no animation applies in this example) and thus the locally set value is used instead of the style setter value for the background on the first button. El segundo botón no tiene ningún valor local (ni ningún otro valor con una precedencia más alta que un establecedor de estilo) y, por tanto, el fondo de ese botón procede del establecedor de estilo.The second button has no local value (and no other value with higher precedence than a style setter) and thus the background in that button comes from the style setter.

<StackPanel>
  <StackPanel.Resources>
    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
     <Setter Property="Background" Value="Red"/>
    </Style>
  </StackPanel.Resources>
  <Button Background="Green">I am NOT red!</Button>
  <Button>I am styled red</Button>
</StackPanel>

¿Por qué existe la precedencia de las propiedades de dependencia?Why does dependency property precedence exist?

Por lo general, no querrá que los estilos siempre apliquen ni oculten siquiera un valor establecido localmente de un elemento individual (de lo contrario, sería muy difícil usar estilos o elementos en general).Typically, you would not want styles to always apply and to obscure even a locally set value of an individual element (otherwise, it would be very difficult to use either styles or elements in general). Por lo tanto, los valores que proceden de estilos funcionan con una precedencia más baja que un valor establecido localmente.Therefore, the values that come from styles operate at a lower precedent than a locally set value. Para obtener una lista más completa de las propiedades de dependencia y conocer la procedencia del valor efectivo de una propiedad de dependencia, consulte Prioridad de los valores de propiedades de dependencia.For a more thorough listing of dependency properties and where a dependency property effective value might come from, see Dependency Property Value Precedence.

Nota

Existen varias propiedades definidas en elementos de WPF que no son propiedades de dependencia.There are a number of properties defined on WPF elements that are not dependency properties. En general, las propiedades se implementaban como propiedades de dependencia solo cuando era necesario admitir al menos uno de los escenarios que habilitaba el sistema de propiedades: enlace de datos, estilos, animación, compatibilidad con los valores predeterminados, herencia, propiedades adjuntas o invalidación.By and large, properties were implemented as dependency properties only when there were needs to support at least one of the scenarios enabled by the property system: data binding, styling, animation, default value support, inheritance, attached properties, or invalidation.

Más información sobre las propiedades de dependenciaLearning more about dependency properties

  • Una propiedad adjunta es un tipo de propiedad que admite una sintaxis especializada en XAML.An attached property is a type of property that supports a specialized syntax in XAML. Una propiedad adjunta no suele tener una correspondencia de 1:1 con una propiedad Common Language Runtime (CLR)common language runtime (CLR) y no es necesariamente una propiedad de dependencia.An attached property often does not have a 1:1 correspondence with a Common Language Runtime (CLR)common language runtime (CLR) property, and is not necessarily a dependency property. El propósito típico de una propiedad adjunta es permitir que los elementos secundarios comuniquen valores de propiedad a un elemento primario, aunque el elemento primario y el elemento secundario no posean a la vez esa propiedad como parte de las listas de miembros de clase.The typical purpose of a attached property is to allow child elements to report property values to a parent element, even if the parent element and child element do not both possess that property as part of the class members listings. Un escenario principal es habilitar los elementos secundarios para que informen al elemento primario de cómo se deben mostrar en IUUI; para obtener un ejemplo, vea Dock o Left.One primary scenario is to enable child elements to inform the parent how they should be presented in IUUI; for an example, see Dock or Left. Para obtener información detallada, vea Información general sobre propiedades asociadas.For details, see Attached Properties Overview.

  • Los desarrolladores de componentes o de aplicaciones pueden querer crear su propia propiedad de dependencia para habilitar funcionalidades, tales como el enlace de datos o la compatibilidad con estilos, o para admitir la invalidación y la coerción de valores.Component developers or application developers may wish to create their own dependency property, in order to enable capabilities such as data binding or styles support, or for invalidation and value coercion support. Para obtener más información, consulte Propiedades de dependencia personalizadas.For details, see Custom Dependency Properties.

  • Por lo general, las propiedades de dependencia deben considerarse propiedades públicas, accesibles o al menos reconocibles para cualquier llamador que tenga acceso a una instancia.Dependency properties should generally be considered to be public properties, accessible or at least discoverable by any caller that has access to an instance. Para obtener más información, consulte Seguridad de las propiedades de dependencia.For more information, see Dependency Property Security.

Vea tambiénSee also