Cenni preliminari sulle dichiarazioni di associazioneBinding Declarations Overview

In questo argomento vengono illustrati i diversi modi in cui è possibile dichiarare un'associazione.This topic discusses the different ways you can declare a binding.

PrerequisitiPrerequisites

Prima di leggere questo argomento, è importante avere familiarità con i concetti e l'utilizzo delle estensioni di markup.Before reading this topic, it is important that you are familiar with the concept and usage of markup extensions. Per altre informazioni sulle estensioni di markup, vedere Estensioni di markup e WPF XAML.For more information about markup extensions, see Markup Extensions and WPF XAML.

In questo argomento non vengono illustrati i concetti relativi all'associazione dati.This topic does not cover data binding concepts. Per informazioni sui concetti relativi all'associazione dati, vedere Cenni preliminari sull'associazione dati.For a discussion of data binding concepts, see Data Binding Overview.

Dichiarazione di un'associazione in XAMLDeclaring a Binding in XAML

Questa sezione illustrato come dichiarare un'associazione in XAML.This section discusses how to declare a binding in XAML.

Uso delle estensioni di markupMarkup Extension Usage

Binding è un'estensione di markup.Binding is a markup extension. Quando si usa l'estensione dell'associazione per dichiarare un'associazione, la dichiarazione è costituita da una serie di clausole che seguono la parola chiave Binding separate da virgole (,).When you use the binding extension to declare a binding, the declaration consists of a series of clauses following the Binding keyword and separated by commas (,). Le clausole nella dichiarazione di associazione possono essere in qualsiasi ordine con molte possibili combinazioni.The clauses in the binding declaration can be in any order and there are many possible combinations. Le clausole sono nome=valore coppie where nome è il nome del Binding proprietà e valore è il valore da impostare per la proprietà.The clauses are Name=Value pairs where Name is the name of the Binding property and Value is the value you are setting for the property.

Durante la creazione di stringhe di dichiarazione di associazione nel markup, queste devono essere associate alla proprietà di dipendenza specifica di un oggetto di destinazione.When creating binding declaration strings in markup, they must be attached to the specific dependency property of a target object. Nell'esempio seguente viene illustrato come associare il TextBox.Text proprietà utilizzando l'estensione di binding, specificando il Source e Path proprietà.The following example shows how to bind the TextBox.Text property using the binding extension, specifying the Source and Path properties.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

È possibile specificare la maggior parte delle proprietà del Binding classe in questo modo.You can specify most of the properties of the Binding class this way. Per ulteriori informazioni sull'estensione dell'associazione e un elenco di Binding le proprietà che non possono essere impostate utilizzando l'estensione dell'associazione, vedere il estensione di Markup di associazione Panoramica.For more information about the binding extension as well as for a list of Binding properties that cannot be set using the binding extension, see the Binding Markup Extension overview.

Sintassi degli elementi oggettoObject Element Syntax

La sintassi degli elementi oggetto è un'alternativa alla creazione della dichiarazione di associazione.Object element syntax is an alternative to creating the binding declaration. Nella maggior parte dei casi, non esiste alcun vantaggio specifico per l'uso dell'estensione di markup rispetto alla sintassi dell'elemento oggetto.In most cases, there is no particular advantage to using either the markup extension or the object element syntax. Tuttavia, nei casi in cui l'estensione di markup non supporta uno scenario, ad esempio quando il valore della proprietà è di un tipo non stringa per il quale non esistono conversioni di tipo, sarà necessario usare la sintassi degli elementi oggetto.However, in cases which the markup extension does not support your scenario, such as when your property value is of a non-string type for which no type conversion exists, you need to use the object element syntax.

Di seguito viene riportato un esempio dell'uso sia della sintassi per elementi oggetto, sia dell'estensione di markup:The following is an example of both the object element syntax and the markup extension usage:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

Nell'esempio viene associato il Foreground proprietà dichiarando un'associazione utilizzando la sintassi dell'estensione.The example binds the Foreground property by declaring a binding using the extension syntax. La dichiarazione di associazione per il Text proprietà viene utilizzata la sintassi dell'elemento oggetto.The binding declaration for the Text property uses the object element syntax.

Per altre informazioni sui diversi termini, vedere Descrizione dettagliata della sintassi XAML.For more information about the different terms, see XAML Syntax In Detail.

MultiBinding e PriorityBindingMultiBinding and PriorityBinding

MultiBinding e PriorityBinding non supportano la sintassi dell'estensione XAML.MultiBinding and PriorityBinding do not support the XAML extension syntax. Pertanto, è necessario utilizzare la sintassi dell'elemento oggetto se si sta dichiarando un MultiBinding o PriorityBinding in XAML.Therefore, you must use the object element syntax if you are declaring a MultiBinding or a PriorityBinding in XAML.

Creazione di un'associazione nel codiceCreating a Binding in Code

È un altro modo per specificare un'associazione per impostare le proprietà direttamente un Binding oggetto nel codice.Another way to specify a binding is to set properties directly on a Binding object in code. Nell'esempio seguente viene illustrato come creare un Binding e specificare le proprietà nel codice.The following example shows how to create a Binding object and specify the properties in code. In questo esempio, TheConverter è un oggetto che implementa il IValueConverter interfaccia.In this example, TheConverter is an object that implements the IValueConverter interface.

private void OnPageLoaded(object sender, EventArgs e)
{
    // Make a new source, to grab a new timestamp
    MyData myChangedData = new MyData();
    
    // Create a new binding
    // TheDate is a property of type DateTime on MyData class
    Binding myNewBindDef = new Binding("TheDate");
    
    myNewBindDef.Mode = BindingMode.OneWay;
    myNewBindDef.Source = myChangedData;
    myNewBindDef.Converter = TheConverter;
    myNewBindDef.ConverterCulture = new CultureInfo("en-US");
    
      // myDatetext is a TextBlock object that is the binding target object
    BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
    BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);

    lbChooseCulture.SelectedIndex = 0;
}
 Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
     ' Make a new source, to grab a new timestamp
     Dim myChangedData As New MyData()

     ' Create a new binding
 ' TheDate is a property of type DateTime on MyData class
     Dim myNewBindDef As New Binding("TheDate")

     myNewBindDef.Mode = BindingMode.OneWay
     myNewBindDef.Source = myChangedData
     myNewBindDef.Converter = TheConverter
     myNewBindDef.ConverterCulture = New CultureInfo("en-US")

' myDatetext is a TextBlock object that is the binding target object
     BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
     BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)

     lbChooseCulture.SelectedIndex = 0
 End Sub

Se l'oggetto a cui si esegue l'associazione è un FrameworkElement o FrameworkContentElement è possibile chiamare il SetBinding metodo sull'oggetto direttamente anziché utilizzare BindingOperations.SetBinding.If the object you are binding is a FrameworkElement or a FrameworkContentElement you can call the SetBinding method on your object directly instead of using BindingOperations.SetBinding. Per un esempio, vedere Creare associazioni nel codice.For an example, see Create a Binding in Code.

Sintassi del percorso di associazioneBinding Path Syntax

Utilizzare il Path proprietà per specificare il valore di origine da associare a:Use the Path property to specify the source value you want to bind to:

  • Nel caso più semplice, il Path valore della proprietà è il nome della proprietà dell'oggetto di origine da utilizzare per l'associazione, ad esempio Path=PropertyName.In the simplest case, the Path property value is the name of the property of the source object to use for the binding, such as Path=PropertyName.

  • Sottoproprietà di una proprietà può essere specificata tramite una sintassi simile simile a c#.Subproperties of a property can be specified by a similar syntax as in C#. Ad esempio, la clausola Path=ShoppingCart.Order imposta l'associazione sulla sottoproprietà Order dell'oggetto o la proprietà ShoppingCart.For instance, the clause Path=ShoppingCart.Order sets the binding to the subproperty Order of the object or property ShoppingCart.

  • Per eseguire l'associazione a una proprietà associata, racchiuderla tra parentesi.To bind to an attached property, place parentheses around the attached property. Ad esempio, per associare la proprietà associata DockPanel.Dock, la sintassi è Path=(DockPanel.Dock).For example, to bind to the attached property DockPanel.Dock, the syntax is Path=(DockPanel.Dock).

  • Gli indicizzatori di una proprietà possono essere specificati all'interno di parentesi quadre dopo il nome della proprietà in cui viene applicato l'indicizzatore.Indexers of a property can be specified within square brackets following the property name where the indexer is applied. La clausola Path=ShoppingCart[0] ad esempio imposta l'associazione all'indice corrispondente al modo in cui l'indicizzazione interna della proprietà gestisce la stringa letterale "0".For instance, the clause Path=ShoppingCart[0] sets the binding to the index that corresponds to how your property's internal indexing handles the literal string "0". Sono supportati anche indicizzatori annidati.Nested indexers are also supported.

  • Indicizzatori e sottoproprietà possono essere combinati in una clausola Path, ad esempio,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].Indexers and subproperties can be mixed in a Path clause; for example, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • All'interno degli indicizzatori è possibile specificare più parametri di indicizzatore separati da virgole (,).Inside indexers you can have multiple indexer parameters separated by commas (,). È possibile specificare tra parentesi il tipo di ogni parametro.The type of each parameter can be specified with parentheses. È possibile ad esempio avere Path="[(sys:Int32)42,(sys:Int32)24]", dove è stato eseguito il mapping di sys allo spazio dei nomi System.For example, you can have Path="[(sys:Int32)42,(sys:Int32)24]", where sys is mapped to the System namespace.

  • Quando l'origine è una visualizzazione di raccolta, è possibile specificare l'elemento corrente con una barra (/).When the source is a collection view, the current item can be specified with a slash (/). La clausola Path=/ ad esempio imposta l'associazione all'elemento corrente nella visualizzazione.For example, the clause Path=/ sets the binding to the current item in the view. Quando l'origine è una raccolta, questa sintassi specifica l'elemento corrente della visualizzazione di raccolta predefinita.When the source is a collection, this syntax specifies the current item of the default collection view.

  • Barre e nomi di proprietà possono essere combinate per attraversare le proprietà che sono raccolte.Property names and slashes can be combined to traverse properties that are collections. Path=/Offices/ManagerName ad esempio specifica l'elemento corrente della raccolta di origine, che contiene una proprietà Offices che è anche una raccolta.For example, Path=/Offices/ManagerName specifies the current item of the source collection, which contains an Offices property that is also a collection. L'elemento corrente è un oggetto che contiene una proprietà ManagerName.Its current item is an object that contains a ManagerName property.

  • È possibile usare facoltativamente un percorso con il punto (.) per eseguire l'associazione all'origine corrente.Optionally, a period (.) path can be used to bind to the current source. Ad esempio, Text="{Binding}" equivale a Text="{Binding Path=.}".For example, Text="{Binding}" is equivalent to Text="{Binding Path=.}".

Meccanismo di escapeEscaping Mechanism

  • All'interno degli indicizzatori ([]), l’accento circonflesso (^) funge da escape per il carattere successivo.Inside indexers ([ ]), the caret character (^) escapes the next character.

  • Se si imposta Path in XAML, è inoltre necessario eseguire l'escape (con entità XML) determinati i caratteri speciali per la definizione del linguaggio XML:If you set Path in XAML, you also need to escape (using XML entities) certain characters that are special to the XML language definition:

    • Usare & come carattere di escape per "&".Use & to escape the character "&".

    • Usare > come carattere di escape per il tag di fine ">".Use > to escape the end tag ">".

  • Se si descrive inoltre l'intera associazione di un attributo usando la sintassi dell'estensione di markup, è necessario usare un carattere di escape (la barra rovesciata \) per i caratteri speciali del parser dell'estensione di markup WPFWPF:Additionally, if you describe the entire binding in an attribute using the markup extension syntax, you need to escape (using backslash \) characters that are special to the WPFWPF markup extension parser:

    • La barra rovesciata (\) è il carattere di escape.Backslash (\) is the escape character itself.

    • Il segno di uguale (=) separa il nome di proprietà dal valore della proprietà.The equal sign (=) separates property name from property value.

    • Le proprietà sono separate da virgole (,).Comma (,) separates properties.

    • La parentesi graffa chiusa (}) è la fine di un'estensione di markup.The right curly brace (}) is the end of a markup extension.

Comportamenti predefinitiDefault Behaviors

Il comportamento predefinito è come indicato di seguito se non viene specificato nella dichiarazione.The default behavior is as follows if not specified in the declaration.

  • Viene creato un convertitore predefinito che tenta di eseguire una conversione di tipo tra il valore dell'origine dell'associazione e il valore della destinazione dell'associazione.A default converter is created that tries to do a type conversion between the binding source value and the binding target value. Se non è possibile eseguire una conversione, il convertitore predefinito restituisce null.If a conversion cannot be made, the default converter returns null.

  • Se non si imposta ConverterCulture, il motore di associazione utilizza la Language proprietà dell'oggetto di destinazione dell'associazione.If you do not set ConverterCulture, the binding engine uses the Language property of the binding target object. In XAML, questo valore viene impostato in modalità predefinita su "en-US" o eredita il valore dell'elemento radice (o qualsiasi elemento) della pagina, se ne è stato impostato uno in modo esplicito.In XAML, this defaults to "en-US" or inherits the value from the root element (or any element) of the page, if one has been explicitly set.

  • Se l'associazione dispone già di un contesto dati (ad esempio, il contesto dati ereditato da un elemento padre) e indipendentemente da quale elemento, o raccolta, restituito da quel contesto sia adatto all'associazione senza richiedere altre modifiche del percorso, una dichiarazione di associazione può essere totalmente priva di clausole: {Binding} Si tratta della modalità con cui spesso si specifica un'associazione per l'applicazione di stili ai dati, se l'associazione agisce su una raccolta.As long as the binding already has a data context (for instance, the inherited data context coming from a parent element), and whatever item or collection being returned by that context is appropriate for binding without requiring further path modification, a binding declaration can have no clauses at all: {Binding} This is often the way a binding is specified for data styling, where the binding acts upon a collection. Per altre informazioni, vedere la sezione "Utilizzo di oggetti interi come origine di associazione" in Cenni preliminari sulle origini di associazione.For more information, see the "Entire Objects Used as a Binding Source" section in the Binding Sources Overview.

  • Il valore predefinito Mode unidirezionale o bidirezionale a seconda della proprietà di dipendenza che è associata.The default Mode varies between one-way and two-way depending on the dependency property that is being bound. È sempre possibile dichiarare in modo esplicito la modalità di associazione per garantire che il comportamento sia quello desiderato.You can always declare the binding mode explicitly to ensure that your binding has the desired behavior. Nelle proprietà di un controllo generale e modificabili dall'utente, ad esempio TextBox.Text e RangeBase.Value, predefinita per le associazioni bidirezionali, mentre la maggior parte delle altre proprietà predefinita su associazioni unidirezionali.In general, user-editable control properties, such as TextBox.Text and RangeBase.Value, default to two-way bindings, whereas most other properties default to one-way bindings.

  • Il valore predefinito UpdateSourceTrigger valore varia tra PropertyChanged e LostFocus a seconda della proprietà di dipendenza associata anche.The default UpdateSourceTrigger value varies between PropertyChanged and LostFocus depending on the bound dependency property as well. Il valore predefinito per la maggior parte delle proprietà di dipendenza è PropertyChanged, mentre la proprietà TextBox.Text ha il valore predefinito LostFocus.The default value for most dependency properties is PropertyChanged, while the TextBox.Text property has a default value of LostFocus.

Vedere ancheSee Also

Panoramica sul data bindingData Binding Overview
Procedure relative alle proprietàHow-to Topics
Data bindingData Binding
Sintassi XAML di PropertyPathPropertyPath XAML Syntax