Visão geral das propriedades de dependênciaDependency properties overview

Este tópico explica o sistema de propriedades de dependência que está disponível quando você escreve um aplicativo do Windows Runtime em C++, C# ou Visual Basic com definições de XAML para a interface do usuário.This topic explains the dependency property system that is available when you write a Windows Runtime app using C++, C#, or Visual Basic along with XAML definitions for UI.

O que é uma propriedade de dependência?What is a dependency property?

Uma propriedade de dependência é um tipo especializado de propriedade.A dependency property is a specialized type of property. Especificamente, é uma propriedade cujo valor é controlado e influenciado por um sistema de propriedades dedicado que é parte do Tempo de Execução do Windows.Specifically it's a property where the property's value is tracked and influenced by a dedicated property system that is part of the Windows Runtime.

Para dar suporte a uma propriedade de dependência, o objeto que define a propriedade deve ser um DependencyObject (em outras palavras, uma classe que tem a classe base DependencyObject em algum lugar de sua herança).In order to support a dependency property, the object that defines the property must be a DependencyObject (in other words a class that has the DependencyObject base class somewhere in its inheritance). Muitos dos tipos que você usa para suas definições de interface do usuário para um aplicativo UWP com XAML serão uma subclasse DependencyObject e oferecerão suporte a propriedades de dependência.Many of the types you use for your UI definitions for a UWP app with XAML will be a DependencyObject subclass, and will support dependency properties. Entretanto, qualquer tipo que venha de um namespace do Tempo de Execução do Windows que não possua "XAML" em seu nome não dará suporte a propriedades de dependência; as propriedades de tais tipos são propriedades comuns que não terão o comportamento de dependência do sistema de propriedades.However, any type that comes from a Windows Runtime namespace that doesn't have "XAML" in its name won't support dependency properties; properties of such types are ordinary properties that won't have the property system's dependency behavior.

A finalidade das propriedades de dependência é oferecer uma forma sistêmica de computar o valor de uma propriedade com base em outras entradas (outras propriedades, eventos e estados que ocorrem em seu aplicativo enquanto ele é executado).The purpose of dependency properties is to provide a systemic way to compute the value of a property based on other inputs (other properties, events and states that occur within your app while it runs). Essas outras entradas podem incluir:These other inputs might include:

  • Entrada externa; por exemplo, preferência do usuárioExternal input such as user preference
  • Mecanismos de determinação de propriedade just-in-time; por exemplo, vinculação de dados, animações e storyboards.Just-in-time property determination mechanisms such as data binding, animations and storyboards
  • Padrões de modelagem para múltiplos usos; por exemplo, recursos e estilosMultiple-use templating patterns such as resources and styles
  • Valores conhecidos por meio das relações pai-filho com outros elementos da árvore de objetosValues known through parent-child relationships with other elements in the object tree

A propriedade de dependência representa ou permite um recurso específico do modelo de programação para a definição de um aplicativo da Windows Store com XAML para interface do usuário e C#, extensões de componente do Microsoft Visual Basic ou Visual C++ (C++/CX) para código.A dependency property represents or supports a specific feature of the programming model for defining a Windows Runtime app with XAML for UI and C#, Microsoft Visual Basic or Visual C++ component extensions (C++/CX) for code. Esses recursos incluem:These features include:

  • Associação de dadosData binding
  • EstilosStyles
  • Animações com storyboardStoryboarded animations
  • Comportamento "PropertyChanged"; uma propriedade de dependência pode ser implementada para fornecer retornos de chamada que podem propagar alterações em outras propriedades de dependência"PropertyChanged" behavior; a dependency property can be implemented to provide callbacks that can propagate changes to other dependency properties
  • Usando um valor padrão que vem dos metadados da propriedadeUsing a default value that comes from property metadata
  • Utilitário do sistema de propriedades gerais, como ClearValue e pesquisa de metadadosGeneral property system utility such as ClearValue and metadata lookup

Propriedades de dependência e propriedades do Tempo de execução do WindowsDependency properties and Windows Runtime properties

As propriedades de dependência estendem a funcionalidade de propriedade básica do Tempo de Execução do Windows, oferecendo um repositório de propriedades global, interno, que grava todas as propriedades de dependência em um aplicativo no tempo de execução.Dependency properties extend basic Windows Runtime property functionality by providing a global, internal property store that backs all of the dependency properties in an app at run time. Trata-se de uma alternativa ao padrão de sustentar uma propriedade com um campo privado na classe property-definition.This is an alternative to the standard pattern of backing a property with a private field that's private in the property-definition class. Você pode pensar em um repositório de propriedades como um conjunto de identificadores de propriedades e de valores existentes para qualquer objeto específico. (desde que seja um DependencyObject).You can think of this internal property store as being a set of property identifiers and values that exist for any particular object (so long as it's a DependencyObject). Em vez de serem identificadas pelo nome, cada propriedade no repositório é identificada por uma instância DependencyProperty.Rather than being identified by name, each property in the store is identified by a DependencyProperty instance. Entretanto, o sistema de propriedades oculta principalmente o detalhe dessa implementação: você pode geralmente acessar as propriedades de dependência, usando um nome simples (o nome da propriedade via programação na linguagem do código que você está usando, ou um nome de atributo quando você está escrevendo em XAML).However, the property system mostly hides this implementation detail: you can usually access dependency properties by using a simple name (the programmatic property name in the code language you're using, or an attribute name when you're writing XAML).

O tipo de base que fornece o suporte ao sistema de propriedades de dependência é DependencyObject.The base type that provides the underpinnings of the dependency property system is DependencyObject. DependencyObject define métodos que podem acessar a propriedade de dependência, e as instâncias de uma classe derivada DependencyObject suportam internamente o conceito de repositório de propriedades mencionado anteriormente.DependencyObject defines methods that can access the dependency property, and instances of a DependencyObject derived class internally support the property store concept we mentioned earlier.

Aqui está uma somatória da terminologia que usamos na documentação ao discutir as propriedades de dependência:Here is a summation of the terminology that we use in the documentation when discussing dependency properties:

TermoTerm DescriçãoDescription
Propriedade de dependênciaDependency property Uma propriedade que existe em um identificador DependencyProperty (veja abaixo).A property that exists on a DependencyProperty identifier (see below). Geralmente, esse identificador está disponível como um membro estático da classe derivada DependencyObject de definição.Usually this identifier is available as a static member of the defining DependencyObject derived class.
Identificador de propriedade de dependênciaDependency property identifier Um valor constante para identificar a propriedade, é normalmente público e somente leitura.A constant value to identify the property, it is typically public and read-only.
Wrapper de propriedadeProperty wrapper As implementações get e set que podem ser chamadas para uma propriedade do Windows Runtime.The callable get and set implementations for a Windows Runtime property. Ou, a projeção específica da linguagem da definição original.Or, the language-specific projection of the original definition. Uma implementação do wrapper de propriedade get chama GetValue, passando o identificador de propriedade de dependência relevante.A get property wrapper implementation calls GetValue, passing the relevant dependency property identifier.

O wrapper da propriedade não é apenas conveniência para os chamadores, ele também apresenta a propriedade de dependência a qualquer processo, ferramenta ou projeção que use as definições do Windows Runtime para propriedades.The property wrapper is not just convenience for callers, it also exposes the dependency property to any process, tool or projection that uses Windows Runtime definitions for properties.

O exemplo a seguir define uma propriedade de dependência personalizada, conforme definido para C#, e mostra a relação do identificador da propriedade de dependência com o wrapper de propriedade.The following example defines a custom dependency property as defined for C#, and shows the relationship of the dependency property identifier to the property wrapper.

public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
  "Label",
  typeof(string),
  typeof(ImageWithLabelControl),
  new PropertyMetadata(null)
);


public string Label
{
    get { return (string)GetValue(LabelProperty); }
    set { SetValue(LabelProperty, value); }
}

Observação

O exemplo anterior não se destina como o exemplo completo de como criar uma propriedade de dependência personalizada.The preceding example is not intended as the complete example for how to create a custom dependency property. Ele tem a finalidade de mostrar os conceitos de propriedade de dependência para qualquer um que prefira conceitos de aprendizagem através de código.It is intended to show dependency property concepts for anyone that prefers learning concepts through code. Para obter uma explicação mais completa deste exemplo, consulte Propriedades de dependência personalizadas.For a more complete explanation of this example, see Custom dependency properties.

Precedência do valor da propriedade de dependênciaDependency property value precedence

Quando você obtém o valor de uma propriedade de dependência, está obtendo um valor que foi definido para essa propriedade por meio de qualquer uma das entradas que participam do sistema de propriedades do Tempo de execução do Windows.When you get the value of a dependency property, you are obtaining a value that was determined for that property through any one of the inputs that participate in the Windows Runtime property system. A precedência do valor de propriedade de dependência existe de forma que o sistema de propriedades do Tempo de Execução do Windows possa calcular valores de uma forma previsível, e é importante que você também esteja familiarizado com a ordem de precedência básica.Dependency property value precedence exists so that the Windows Runtime property system can calculate values in a predictable way, and it's important that you be familiar with the basic precedence order too. Caso contrário, você pode se encontrar em uma situação em que esteja tentando definir uma propriedade em um nível, mas algo (o sistema, chamadores de terceiros, parte de seu próprio código) a está definindo em outro nível, e você ficará frustrado tentando descobrir qual valor da propriedade é usado e de onde esse valor veio.Otherwise, you might find yourself in a situation where you're trying to set a property at one level of precedence but something else (the system, third-party callers, some of your own code) is setting it at another level, and you'll get frustrated trying to figure out which property value is used and where that value came from.

Por exemplo, os estilos e modelos destinam-se a ser um ponto de partida compartilhado para estabelecer valores de propriedade e, assim, a aparência de um controle.For example, styles and templates are intended to be a shared starting point for establishing property values and thus appearances of a control. Mas, em uma ocorrência específica do controle, pode ser preciso alterar esse valor em relação ao valor de modelo comum, como aplicar a esse controle uma cor da tela de fundo diferente ou uma cadeia de caracteres de texto diferente como conteúdo.But on a particular control instance you might want to change its value versus the common templated value, such as giving that control a different background color or a different text string as content. O sistema de propriedades do Tempo de execução do Windows considera valores locais em precedência maior que os valores fornecidos por estilos e modelos.The Windows Runtime property system considers local values at higher precedence than values provided by styles and templates. Isso permite que o cenário de valores específicos do aplicativo substituam os modelos, de modo que os controles sejam úteis para o próprio uso deles na interface do usuário do aplicativo.That enables the scenario of having app-specific values overwrite the templates so that the controls are useful for your own use of them in app UI.

Lista de precedência das propriedades de dependência Dependency property precedence list

A seguir está a ordem definitiva que o sistema de propriedades usa ao atribuir o valor do tempo de execução de uma propriedade de dependência.The following is the definitive order that the property system uses when assigning the run-time value for a dependency property. A precedência mais alta é listada primeiro.Highest precedence is listed first. Você encontrará explicações mais detalhadas logo após essa lista.You'll find more detailed explanations just past this list.

  1. Valores animados: animações ativas, animações de estado visual ou animações com um comportamento HoldEnd.Animated values: Active animations, visual state animations, or animations with a HoldEnd behavior. Para ter efeito prático, uma animação aplicada a uma propriedade deve ter precedência sobre o valor básico (não animado), mesmo que esse valor seja definido localmente.To have any practical effect, an animation applied to a property must have precedence over the base (unanimated) value, even if that value was set locally.
  2. Valor local: um valor local pode ser definido por meio da conveniência do wrapper da propriedade, que também equivale à configuração como um elemento de atributo ou de propriedade na XAML ou por uma chamada ao método SetValue usando uma propriedade de uma instância específica.Local value: A local value might be set through the convenience of the property wrapper, which also equates to setting as an attribute or property element in XAML, or by a call to the SetValue method using a property of a specific instance. Se você definir um valor local usando uma associação ou um recurso estático, eles atuarão na precedência como se um valor local fosse definido, e as referências de associações ou de recursos serão apagadas se um novo valor local for definido.If you set a local value by using a binding or a static resource, these each act in the precedence as if a local value was set, and bindings or resource references are erased if a new local value is set.
  3. Propriedades modelo: um elemento as tem se tiver sido criado como parte de um modelo (um ControlTemplate ou DataTemplate).Templated properties: An element has these if it was created as part of a template (from a ControlTemplate or DataTemplate).
  4. Setters de estilo: valores de um Setter em estilos de recursos de página ou aplicativo.Style setters: Values from a Setter within styles from page or application resources.
  5. Valor padrão: uma propriedade de dependência pode ter um valor padrão como parte de seus metadados.Default value: A dependency property can have a default value as part of its metadata.

Propriedades modeloTemplated properties

As propriedades modelo, como um item de precedência, não se aplicam a qualquer propriedade de um elemento que você declare diretamente na marcação da página da XAML.Templated properties as a precedence item do not apply to any property of an element that you declare directly in XAML page markup. O conceito de propriedade modelo existe apenas para objetos que são criados quando o Tempo de Execução do Windows aplica um modelo XAML a um elemento de interface do usuário e, portanto, define seu visual.The templated property concept exists only for objects that are created when the Windows Runtime applies a XAML template to a UI element and thus defines its visuals.

Todas as propriedades definidas a partir de um modelo de controle apresentam valores de algum tipo.All the properties that are set from a control template have values of some kind. Esses valores são quase como um conjunto estendido de valores padrão para o controle e são frequentemente associados aos valores que você pode redefinir posteriormente, definindo os valores de propriedade diretamente.These values are almost like an extended set of default values for the control and are often associated with values you can reset later by setting the property values directly. Assim, os valores de conjunto modelo devem ser distinguíveis de um verdadeiro valor local, de modo que qualquer novo valor local possa substituí-lo.Thus the template-set values must be distinguishable from a true local value, so that any new local value can overwrite it.

Observação

Em muitos casos, o modelo pode substituir até mesmo valores locais, se o modelo não tiver conseguido expor referências da extensão de marcação {TemplateBinding} para propriedades que devem ter sido configuráveis nas instâncias.In some cases the template might override even local values, if the template failed to expose {TemplateBinding} markup extension references for properties that should have been settable on instances. Isso geralmente é feito somente se a propriedade realmente não se destina a ser definida em instâncias, por exemplo, se ela for relevante apenas para o comportamento de visuais e de modelo e não para a função pretendida ou a lógica de tempo de execução do controle que usa o modelo.This is usually done only if the property is really not intended to be set on instances, for example if it's only relevant to visuals and template behavior and not to the intended function or runtime logic of the control that uses the template.

Associações e precedênciaBindings and precedence

As operações de associação têm a precedência apropriada para qualquer escopo em que são usadas.Binding operations have the appropriate precedence for whatever scope they're used for. Por exemplo, uma {Associação} aplicada a um valor local age como um valor local, e uma extensão de marcação {TemplateBinding} de um setter da propriedade se aplica como um setter do estilo.For example, a {Binding} applied to a local value acts as local value, and a {TemplateBinding} markup extension for a property setter applies as a style setter does. Como as associações devem aguardar até o tempo de execução para obter valores de fontes de dados, o processo de determinar a precedência do valor de propriedade de qualquer propriedade também se estende para o tempo de execução.Because bindings must wait until run-time to obtain values from data sources, the process of determining the property value precedence for any property extends into run-time as well.

As associações não apenas operam com a mesma precedência como um valor local, elas realmente são um valor local, em que a associação é o espaço reservado de um valor que é adiado.Not only do bindings operate at the same precedence as a local value, they really are a local value, where the binding is the placeholder for a value that is deferred. Se você tiver uma associação para um valor de propriedade, e você define um valor local nele no tempo de execução, isso substitui totalmente a associação.If you have a binding in place for a property value, and you set a local value on it at run-time, that replaces the binding entirely. Similarmente, se você chamar SetBinding para definir uma associação que apenas surge no tempo de execução, você substitui qualquer valor local que tenha aplicado no XAML ou com código executado anteriormente.Similarly, if you call SetBinding to define a binding that only comes into existence at run-time, you replace any local value you might have applied in XAML or with previously executed code.

Animações com storyboard e valor baseStoryboarded animations and base value

Animações com storyboard agem em relação ao conceito de um valor base.Storyboarded animations act on a concept of a base value. O valor base é o valor que é determinado pelo sistema de propriedades usando sua precedência, mas omitindo essa última etapa de procura de animações.The base value is the value that's determined by the property system using its precedence, but omitting that last step of looking for animations. Por exemplo, um valor base deve vir de um modelo de controle, ou pode vir da configuração de um valor local em uma instância de um controle.For example, a base value might come from a control's template, or it might come from setting a local value on an instance of a control. De qualquer forma, aplicar uma animação substituirá esse valor base e aplicará o valor animado durante o tempo em que a animação continua a ser executada.Either way, applying an animation will overwrite this base value and apply the animated value for as long as your animation continues to run.

Para uma propriedade animada, o valor base ainda pode ter um efeito no comportamento da animação, se essa animação não especificar explicitamente From e To, ou se a animação reverte a propriedade para seu valor básico quando concluída.For an animated property, the base value can still have an effect on the animation's behavior, if that animation does not explicitly specify both From and To, or if the animation reverts the property to its base value when completed. Nesses casos, quando uma animação não estiver mais sendo executada, o resto da precedência é usado novamente.In these cases, once an animation is no longer running, the rest of the precedence is used again.

Entretanto, uma animação que especifica um To com um comportamento HoldEnd pode substituir um valor local até que a animação seja removida, mesmo que ela pareça estar visualmente interrompida.However, an animation that specifies a To with a HoldEnd behavior can override a local value until the animation is removed, even when it visually appears to be stopped. Conceitualmente, ela é como uma animação que é executada infinitamente mesmo que não haja uma animação visual na interface do usuário.Conceptually this is like an animation that's running forever even if there is not a visual animation in the UI.

Várias animações podem ser aplicadas a uma única propriedade.Multiple animations can be applied to a single property. Cada uma dessas animações pode ter sido definida para substituir valores base que vêm de pontos diferentes na precedência de valor.Each of these animations might have been defined to replace base values that came from different points in the value precedence. Entretanto, essas animações serão executadas simultaneamente no tempo de execução, e isso frequentemente significa que elas devem combinar seus valores porque cada animação tem a mesma influência no valor.However, these animations will all be running simultaneously at run time, and that often means that they must combine their values because each animation has equal influence on the value. Isso depende de como exatamente as animações são definidas e do tipo do valor que está sendo animado.This depends on exactly how the animations are defined, and the type of the value that is being animated.

Para saber mais, consulte Animações com storyboard.For more info, see Storyboarded animations.

Valores padrãoDefault values

O estabelecimento do valor padrão para uma propriedade de dependência com um valor PropertyMetadata é explicado com mais detalhes no tópico Propriedades de dependência personalizada.Establishing the default value for a dependency property with a PropertyMetadata value is explained in more detail in the Custom dependency properties topic.

As propriedades de dependência ainda possuem valores padrão, mesmo que esses valores padrão não tenham sido definidos explicitamente nos metadados dessas propriedades.Dependency properties still have default values even if those default values weren't explicitly defined in that property's metadata. A menos que tenham sido alterados por metadados, os valores padrão das propriedades de dependência do Tempo de Execução do Windows são geralmente um dos seguintes:Unless they have been changed by metadata, default values for the Windows Runtime dependency properties are generally one of the following:

  • Uma propriedade que usa um objeto de tempo de execução ou o tipo básico Object (um tipo de referência) possui um valor padrão null.A property that uses a run-time object or the basic Object type (a reference type) has a default value of null. Por exemplo, DataContext é null até que seja definido deliberadamente ou herdado.For example, DataContext is null until it's deliberately set or is inherited.
  • Uma propriedade que usa um valor básico, como números ou um valor booliano (um tipo de valor) usa um padrão esperado para esse valor.A property that uses a basic value such as numbers or a Boolean value (a value type) uses an expected default for that value. Por exemplo, 0 para inteiros e números de ponto flutuante, false para um booliano.For example, 0 for integers and floating-point numbers, false for a Boolean.
  • Uma propriedade que usa uma estrutura do Tempo de Execução do Windows possui um valor padrão que é obtido pela chamada ao construtor padrão implícito dessa estrutura.A property that uses a Windows Runtime structure has a default value that's obtained by calling that structure's implicit default constructor. Esse construtor usa os padrões de cada um dos campos de valor básico da estrutura.This constructor uses the defaults for each of the basic value fields of the structure. Por exemplo, um padrão de um valor Point é inicializado com seus valores X e Y como 0.For example, a default for a Point value is initialized with its X and Y values as 0.
  • Uma propriedade que usa uma enumeração possui um valor padrão do primeiro membro definido nessa enumeração.A property that uses an enumeration has a default value of the first defined member in that enumeration. Verifique a referência a enumerações específicas para ver qual é o valor padrão.Check the reference for specific enumerations to see what the default value is.
  • Uma propriedade que usa uma cadeia de caracteres (System.String para .NET, Platform::String para C++/CX) tem um valor padrão de uma cadeia de caracteres vazia ("").A property that uses a string (System.String for .NET, Platform::String for C++/CX) has a default value of an empty string ("").
  • As propriedades de coleção não são normalmente implementadas como propriedades de dependência, por razões discutidas mais adiante neste tópico.Collection properties aren't typically implemented as dependency properties, for reasons discussed further on in this topic. Mas se você implementar uma propriedade de coleção personalizada e quiser que ela seja uma propriedade de dependência, lembre-se de evitar um singleton não intencional conforme descrito quase no final de Propriedades de dependência personalizada.But if you implement a custom collection property and you want it to be a dependency property, make sure to avoid an unintentional singleton as described near the end of Custom dependency properties.

Funcionalidade de propriedade fornecida por uma propriedade de dependênciaProperty functionality provided by a dependency property

Associação de dadosData binding

Uma propriedade de dependência pode ter seu valor definido por meio de uma vinculação de dados.A dependency property can have its value set through applying a data binding. A vinculação de dados usa a sintaxe da extensão de marcação {Binding} em XAML, extensão de marcação {x:Bind} ou a classe Binding no nó.Data binding uses the {Binding} markup extension syntax in XAML, {x:Bind} markup extension or the Binding class in code. Para uma propriedade associada aos dados, a determinação do valor final da propriedade é adiada até o tempo de execução.For a databound property, the final property value determination is deferred until run time. Nesse momento, o valor é obtido de uma fonte de dados.At that time the value is obtained from a data source. A função que o sistema de propriedades de dependência exerce aqui é permitir um comportamento de espaço reservado para operações como carregamento do XAML quando o valor ainda não é conhecido, e o fornecer o valor no tempo de execução por meio da interação com o mecanismo de vinculação de dados do Tempo de Execução do Windows.The role that the dependency property system plays here is enabling a placeholder behavior for operations like loading XAML when the value is not yet known, and then supplying the value at run time by interacting with the Windows Runtime data binding engine.

O exemplo a seguir define o valor Text para um elemento TextBlock, usando uma associação no XAML.The following example sets the Text value for a TextBlock element, using a binding in XAML. A associação usa um contexto de dados herdado e um objeto da fonte de dados.The binding uses an inherited data context and an object data source. (Nenhum destes é exibido no exemplo curto; para obter uma amostra mais completa que mostre o contexto e a fonte, consulte Vinculação de dados em detalhes.)(Neither of these is shown in the shortened example; for a more complete sample that shows context and source, see Data binding in depth.)

<Canvas>
  <TextBlock Text="{Binding Team.TeamName}"/>
</Canvas>

Você também pode estabelecer associações usando código em vez de XAML.You can also establish bindings using code rather than XAML. Veja SetBinding.See SetBinding.

Observação

Associações como essa são tratadas como um valor local para fins de precedência de valor da propriedade de dependência.Bindings like this are treated as a local value for purposes of dependency property value precedence. Se você definir outro valor local para uma propriedade que originalmente tinha um valor Binding, você substituirá totalmente a associação, não apenas o valor de tempo de execução da associação.If you set another local value for a property that originally held a Binding value, you will overwrite the binding entirely, not just the binding's run-time value. As associações {x: Bind} são implementadas usando o código gerado que definirá um valor local para a propriedade.{x:Bind} Bindings are implemented using generated code that will set a local value for the property. Se você definir um valor local para uma propriedade que está usando {x:Bind}, em seguida, esse valor será substituído na próxima vez que a associação for avaliada, por exemplo, quando observar uma propriedade alterar em seu objeto de origem.If you set a local value for a property that is using {x:Bind}, then that value will be replaced the next time the binding is evaluated, such as when it observes a property change on its source object.

Associar origens, associar destinos, a função de FrameworkElementBinding sources, binding targets, the role of FrameworkElement

Para ser a origem de uma associação, uma propriedade não precisa ser uma propriedade de dependência; você geralmente pode usar qualquer propriedade como uma origem de associação, embora isso dependa de sua linguagem de programação e cada uma tem determinadas margens.To be the source of a binding, a property does not need to be a dependency property; you can generally use any property as a binding source, although this depends on your programming language and each has certain edge cases. Entretanto, para ser o destino de uma extensão de marcação {Binding} ou Associação, essa propriedade deve ser uma propriedade de dependência.However, to be the target of a {Binding} markup extension or Binding, that property must be a dependency property. A {x:Bind} não têm esse requisito enquanto usa código gerado para aplicar a seus valores de associação.{x:Bind} does not have this requirement as it uses generated code to apply its binding values.

Se você estiver criando uma associação no código, observe que a API SetBinding é definida apenas para FrameworkElement.If you are creating a binding in code, note that the SetBinding API is defined only for FrameworkElement. Entretanto, você pode criar uma definição de associação usando BindingOperations em vez disso e, assim fazer referência a qualquer propriedade de DependencyObject.However, you can create a binding definition using BindingOperations instead, and thus reference any DependencyObject property.

Tanto para código ou XAML, lembre-se que DataContext é uma propriedade de FrameworkElement.For either code or XAML, remember that DataContext is a FrameworkElement property. Usando uma forma de herança de propriedade pai-filha (geralmente estabelecida na marcação XAML), o sistema de associações pode resolver um DataContext que existe em um elemento pai.By using a form of parent-child property inheritance (typically established in XAML markup), the binding system can resolve a DataContext that exists on a parent element. Essa herança pode avaliar inclusive se o objeto filho (que possui a propriedade de destino) não é FrameworkElement e, portanto, não mantém seu próprio valor DataContext.This inheritance can evaluate even if the child object (which has the target property) is not a FrameworkElement and therefore does not hold its own DataContext value. Entretanto, o elemento pai que está sendo herdado deve ser um FrameworkElement para definir e manter o DataContext.However, the parent element being inherited must be a FrameworkElement in order to set and hold the DataContext. Como alternativa, você deve definir a associação para que ela possa funcionar com um valor null para DataContext.Alternatively, you must define the binding such that it can function with a null value for DataContext.

Conectar a associação não é a única coisa que é necessária para a maioria dos cenários de associação.Wiring the binding is not the only thing that's needed for most data binding scenarios. Para uma associação unidirecional ou bidirecional ser eficaz, a propriedade de origem deve dar suporte a notificações de alteração que se propagam para o sistema de associação e, portanto, o destino.For a one-way or two-way binding to be effective, the source property must support change notifications that propagate to the binding system and thus the target. Para fontes de associação personalizadas, isso significa que a propriedade deve ser uma propriedade de dependência ou o objeto deve suportar INotifyPropertyChanged.For custom binding sources, this means that the property must be a dependency property, or the object must support INotifyPropertyChanged. As coleções devem dar suporte a INotifyCollectionChanged.Collections should support INotifyCollectionChanged. Determinadas classes dão suporte a uma dessas interfaces em suas implementações para que sejam úteis como classes básicas para situações de vinculação de dados; um exemplo dessa classe é ObservableCollection<T>.Certain classes support these interfaces in their implementations so that they are useful as base classes for data binding scenarios; an example of such a class is ObservableCollection<T>. Para saber mais sobre vinculação de dados e como a vinculação de dados se relaciona ao sistema de propriedades, consulte Vinculação de dados em detalhes.For more information on data binding and how data binding relates to the property system, see Data binding in depth.

Observação

Os tipos listados aqui dão suporte a Microsoft .NET fontes de dados.The types listed here support Microsoft .NET data sources. As fontes de dados C++/CX usam interfaces diferentes para notificação de alteração ou comportamento observável, consulte a seção Vinculação de dados em detalhes.C++/CX data sources use different interfaces for change notification or observable behavior, see Data binding in depth.

Estilos e modelosStyles and templates

Estilos e modelos são dois dos principais cenários para que as propriedades sejam definidas como propriedades de dependência.Styles and templates are two of the scenarios for properties being defined as dependency properties. Os estilos são úteis para definir as propriedades que definem a interface do usuário do aplicativo.Styles are useful for setting properties that define the app's UI. Os estilos são definidos como recursos em XAML, seja como uma entrada em uma coleção de Resources, seja em arquivos XAML separados, por exemplo, em dicionários de recursos de tema.Styles are defined as resources in XAML, either as an entry in a Resources collection, or in separate XAML files such as theme resource dictionaries. Os estilos interagem com o sistema de propriedades porque eles contêm setters para propriedades.Styles interact with the property system because they contain setters for properties. A propriedade mais importante aqui é a propriedade Control.Template de um Control, que define a maior parte da aparência visual e do estado visual do Control.The most important property here is the Control.Template property of a Control: it defines most of the visual appearance and visual state for a Control. Para saber mais sobre estilos e obter alguns exemplos de XAML que definem um Style e usam setters, consulte Definindo o estilo de controles.For more info on styles, and some example XAML that defines a Style and uses setters, see Styling controls.

Os valores que vêm de estilos ou modelos são valores adiados, semelhantes a associações.Values that come from styles or templates are deferred values, similar to bindings. Tanto que os usuários de controles podem remodelar controles ou redefinir estilos.This is so that control users can re-template controls or redefine styles. E é por isso que os setters de propriedade em estilos só podem atuar em propriedades de dependência, não em propriedades comuns.And that's why property setters in styles can only act on dependency properties, not ordinary properties.

Animações com storyboardStoryboarded animations

Você pode animar o valor de uma propriedade de dependência usando uma animação com storyboard.You can animate a dependency property's value using a storyboarded animation. As animações com storyboard no Tempo de Execução do Windows não são meramente decorações visuais.Storyboarded animations in the Windows Runtime are not merely visual decorations. É mais útil pensar em animações como sendo uma técnica de máquina de estado que pode definir os valores de propriedades individuais ou de todas as propriedades e visuais de um controle, e alterar esses valores ao longo do tempo.It's more useful to think of animations as being a state machine technique that can set the values of individual properties or of all properties and visuals of a control, and change these values over time.

Para ser animada, a propriedade de destino da animação deve ser uma propriedade de dependência.To be animated, the animation's target property must be a dependency property. Além disso, para ser animado, o tipo de valor da propriedade de destino deve ter suporte de um dos tipos existentes de animação derivados de Timeline.Also, to be animated, the target property's value type must be supported by one of the existing Timeline-derived animation types. Valores de Color, Double e Point podem ser animados por meio de técnicas de interpolação ou quadro-chave.Values of Color, Double and Point can be animated using either interpolation or keyframe techniques. A maioria dos outros valores pode ser animada por meio de quadros-chave discretos Object.Most other values can be animated using discrete Object key frames.

Quando uma animação é aplicada e está em execução, o valor animado opera em uma precedência maior que qualquer valor (como um valor local) que a propriedade tenha.When an animation is applied and running, the animated value operates at a higher precedence than any value (such as a local value) that the property otherwise has. As animações também têm um comportamento HoldEnd opcional que pode fazer com que apliquem valores de propriedade, mesmo que a animação visualmente pareça estar parada.Animations also have an optional HoldEnd behavior that can cause animations to apply to property values even if the animation visually appears to be stopped.

O princípio de máquina de estado é consagrado pelo uso de animações com storyboard como parte do modelo de estado VisualStateManager para controles.The state machine principle is embodied by the use of storyboarded animations as part of the VisualStateManager state model for controls. Para saber mais sobre animações com storyboard, consulte Animações com storyboard.For more info on storyboarded animations, see Storyboarded animations. Para saber mais sobre VisualStateManager e definir estados visuais para controles, consulte Animações com storyboard para estados visuais ou Modelos de controle.For more info on VisualStateManager and defining visual states for controls, see Storyboarded animations for visual states or Control templates.

Comportamento de propriedade alteradoProperty-changed behavior

O comportamento de propriedade alterado é a origem da parte "dependência" da terminologia de propriedade de dependência.Property-changed behavior is the origin of the "dependency" part of dependency property terminology. A manutenção de valores válidos de uma propriedade em que outra propriedade pode influenciar o valor da primeira propriedade é um problema de desenvolvimento difícil em muitas estruturas.Maintaining valid values for a property when another property can influence the first property's value is a difficult development problem in many frameworks. No sistema de propriedades do Tempo de Execução do Windows, cada propriedade de dependência pode especificar um retorno de chamada que é invocado quando o respectivo valor de propriedade é alterado.In the Windows Runtime property system, each dependency property can specify a callback that is invoked whenever its property value changes. Esse retorno de chamada pode ser usado para notificar ou alterar valores de propriedades relacionados de forma geralmente síncrona.This callback can be used to notify or change related property values, in a generally synchronous manner. Muitas propriedades de dependência existentes têm um comportamento de propriedade alterado.Many existing dependency properties have a property-changed behavior. Você também pode adicionar comportamento semelhante de retorno de chamada para propriedades de dependência personalizadas e implementar os seus próprios retornos de chamada de propriedade alterada.You can also add similar callback behavior to custom dependency properties, and implement your own property-changed callbacks. Consulte Propriedades de dependência personalizadas para ver um exemplo.See Custom dependency properties for an example.

O Windows 10 apresenta o método RegisterPropertyChangedCallback.Windows 10 introduces the RegisterPropertyChangedCallback method. Isso permite que o código do aplicativo se registre para receber notificações de alteração quando a propriedade de dependência especificada é alterada em uma instância de DependencyObject.This enables application code to register for change notifications when the specified dependency property is changed on an instance of DependencyObject.

Valor padrão e ClearValueDefault value and ClearValue

Uma propriedade de dependência pode ter um valor padrão definido como parte de seus metadados de propriedade.A dependency property can have a default value defined as part of its property metadata. Para uma propriedade de dependência, seu valor padrão não se torna irrelevante depois que a propriedade tiver sido definida pela primeira vez.For a dependency property, its default value doesn't become irrelevant after the property's been set the first time. O valor padrão talvez se aplique novamente no tempo de execução sempre que outro determinante na precedência do valor desaparece.The default value might apply again at run-time whenever some other determinant in value precedence disappears. (A precedência do valor das propriedades de dependência é discutida na próxima seção.) Por exemplo, você pode deliberadamente remover um valor de estilo ou uma animação que se aplica a uma propriedade, mas quer que o valor seja um padrão razoável após fazê-lo.(Dependency property value precedence is discussed in the next section.) For example, you might deliberately remove a style value or an animation that applies to a property, but you want the value to be a reasonable default after you do so. O valor padrão de propriedade de dependência pode fornecer esse valor, sem a necessidade de definir especificamente o valor de cada propriedade como um passo extra.The dependency property default value can provide this value, without needing to specifically set each property's value as an extra step.

Você pode definir deliberadamente uma propriedade para o valor padrão, mesmo depois de a ter definido com um valor local.You can deliberately set a property to the default value even after you have already set it with a local value. Para redefinir um valor para ser o padrão novamente e também para permitir outros participantes na precedência que possam substituir o padrão, mas não um valor local, chame o método ClearValue (referência à propriedade para limpar como um parâmetro do método).To reset a value to be the default again, and also to enable other participants in precedence that might override the default but not a local value, call the ClearValue method (reference the property to clear as a method parameter). Você nem sempre quer que a propriedade use literalmente o valor padrão, mas limpar o valor local e reverter para o valor padrão pode permitir outro item na precedência que você quer que atue agora, como usar o valor que veio de um setter de estilo em um modelo de controle.You don't always want the property to literally use the default value, but clearing the local value and reverting to the default value might enable another item in precedence that you want to act now, such as using the value that came from a style setter in a control template.

DependencyObject e threadingDependencyObject and threading

Todas as instâncias de DependencyObject devem ser criadas no thread da interface do usuário que está associado à Window mostrada por um aplicativo do Tempo de Execução do Windows.All DependencyObject instances must be created on the UI thread which is associated with the current Window that is shown by a Windows Runtime app. Embora seja necessário que cada DependencyObject seja criada no thread da interface do usuário principal, os objetos podem ser acessados usando uma referência de dispatcher de outros threads acessando a propriedade Dispatcher.Although each DependencyObject must be created on the main UI thread, the objects can be accessed using a dispatcher reference from other threads, by accessing the Dispatcher property. Em seguida, você pode chamar métodos como RunAsync no objeto CoreDispatcher e executar o código dentro das regras de restrições de thread no thread de interface do usuário.Then you can call methods such as RunAsync on the CoreDispatcher object, and execute your code within the rules of thread restrictions on the UI thread.

Os aspectos de threading de DependencyObject são relevantes porque em geral isso significa que somente o código que é executado no thread da interface do usuário pode mudar ou até mesmo ler o valor de uma propriedade de dependência.The threading aspects of DependencyObject are relevant because it generally means that only code that runs on the UI thread can change or even read the value of a dependency property. Em geral, é possível evitar os problemas com threading em códigos de interface do usuário típicos que usam corretamente padrões async e threads de trabalho em segundo plano.Threading issues can usually be avoided in typical UI code that makes correct use of async patterns and background worker threads. Normalmente, você tem problemas de threading relacionados a DependencyObject somente quando define seus próprios tipos de DependencyObject e tenta usá-los para fontes de dados ou outros cenários em que um DependencyObject não é necessariamente apropriado.You typically only run into DependencyObject-related threading issues if you are defining your own DependencyObject types and you attempt to use them for data sources or other scenarios where a DependencyObject isn't necessarily appropriate.

Material conceitualConceptual material