Panoramica sulle dichiarazioni di associazione

In questo argomento vengono illustrati i diversi modi in cui è possibile dichiarare un'associazione.

Prerequisiti

Prima di leggere questo argomento, è importante avere familiarità con i concetti e l'utilizzo delle estensioni di markup. Per altre informazioni sulle estensioni di markup, vedere Estensioni di markup e WPF XAML.

In questo argomento non vengono illustrati i concetti relativi all'associazione dati. Per informazioni sui concetti relativi all'associazione dati, vedere Cenni preliminari sull'associazione dati.

Dichiarazione di un'associazione in XAML

Questa sezione illustrato come dichiarare un'associazione in XAML.

Uso delle estensioni di markup

Binding è un'estensione di markup. 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 (,). Le clausole nella dichiarazione di associazione possono essere in qualsiasi ordine con molte possibili combinazioni. Le clausole sono coppie nome-valore= in cui Name è il nome della Binding proprietà e Value è il valore che si sta impostando per la proprietà.

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. Nell'esempio seguente viene illustrato come associare la proprietà usando l'estensione TextBox.Text di associazione, specificando le Source proprietà e Path .

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

È possibile specificare la maggior parte delle proprietà della Binding classe in questo modo. Per altre informazioni sull'estensione di associazione e per un elenco di Binding proprietà che non possono essere impostate tramite l'estensione di associazione, vedere Panoramica dell'estensione di markup di binding.

Sintassi degli elementi oggetto

La sintassi degli elementi oggetto è un'alternativa alla creazione della dichiarazione di associazione. Nella maggior parte dei casi, non esiste alcun vantaggio specifico per l'uso dell'estensione di markup rispetto alla sintassi dell'elemento oggetto. 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.

Di seguito viene riportato un esempio dell'uso sia della sintassi per elementi oggetto, sia dell'estensione di markup:

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

Nell'esempio la Foreground proprietà viene associata dichiarando un'associazione usando la sintassi dell'estensione. La dichiarazione di associazione per la Text proprietà utilizza la sintassi dell'elemento oggetto.

Per altre informazioni sui diversi termini, vedere Descrizione dettagliata della sintassi XAML.

MultiBinding e PriorityBinding

MultiBinding e PriorityBinding non supportano la sintassi dell'estensione XAML. Pertanto, devi usare la sintassi dell'elemento oggetto se dichiari un MultiBinding oggetto o PriorityBinding in XAML.

Creazione di un'associazione nel codice

Un altro modo per specificare un'associazione consiste nell'impostare le proprietà direttamente su un Binding oggetto nel codice. Nell'esempio seguente viene illustrato come creare un Binding oggetto e specificare le proprietà nel codice. In questo esempio è TheConverter un oggetto che implementa l'interfaccia IValueConverter .

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 sta eseguendo l'associazione è o FrameworkElement FrameworkContentElement è possibile chiamare direttamente il metodo sull'oggetto SetBinding anziché usare BindingOperations.SetBinding. Per un esempio, vedere Creare associazioni nel codice.

Sintassi del percorso di associazione

Usare la Path proprietà per specificare il valore di origine a cui si vuole eseguire l'associazione:

  • 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.

  • Le proprietà secondarie di una proprietà possono essere specificate da una sintassi simile a quella in C#. Ad esempio, la clausola Path=ShoppingCart.Order imposta l'associazione sulla sottoproprietà Order dell'oggetto o la proprietà ShoppingCart.

  • Per eseguire l'associazione a una proprietà associata, racchiuderla tra parentesi. Ad esempio, per eseguire l'associazione alla proprietà DockPanel.Dockassociata , la sintassi è 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. 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". Sono supportati anche indicizzatori annidati.

  • Indicizzatori e sottoproprietà possono essere combinati in una clausola Path, ad esempio,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • All'interno degli indicizzatori è possibile specificare più parametri di indicizzatore separati da virgole (,). È possibile specificare tra parentesi il tipo di ogni parametro. È possibile ad esempio avere Path="[(sys:Int32)42,(sys:Int32)24]", dove è stato eseguito il mapping di sys allo spazio dei nomi System.

  • Quando l'origine è una visualizzazione di raccolta, è possibile specificare l'elemento corrente con una barra (/). La clausola Path=/ ad esempio imposta l'associazione all'elemento corrente nella visualizzazione. Quando l'origine è una raccolta, questa sintassi specifica l'elemento corrente della visualizzazione di raccolta predefinita.

  • Barre e nomi di proprietà possono essere combinate per attraversare le proprietà che sono raccolte. Path=/Offices/ManagerName ad esempio specifica l'elemento corrente della raccolta di origine, che contiene una proprietà Offices che è anche una raccolta. L'elemento corrente è un oggetto che contiene una proprietà ManagerName.

  • È possibile usare facoltativamente un percorso con il punto (.) per eseguire l'associazione all'origine corrente. Ad esempio, Text="{Binding}" equivale a Text="{Binding Path=.}".

Meccanismo di escape

  • All'interno degli indicizzatori ([]), l’accento circonflesso (^) funge da escape per il carattere successivo.

  • Se imposti Path in XAML, devi anche eseguire l'escape (usando entità XML) determinati caratteri speciali per la definizione del linguaggio XML:

    • Usare &amp; come carattere di escape per "&".

    • Usare &gt; per eseguire l'escape del tag di fine ">".

  • Inoltre, se si descrive l'intera associazione in un attributo usando la sintassi dell'estensione di markup, è necessario usare caratteri di escape (usando la barra rovesciata \) speciali per il parser dell'estensione di markup WPF:

    • Barra rovesciata (\) è il carattere di escape stesso.

    • Il segno di uguale (=) separa il nome di proprietà dal valore della proprietà.

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

    • La parentesi graffa chiusa (}) è la fine di un'estensione di markup.

Comportamenti predefiniti

Il comportamento predefinito è come indicato di seguito se non viene specificato nella dichiarazione.

  • 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. Se non è possibile eseguire una conversione, il convertitore predefinito restituisce null.

  • Se non si imposta ConverterCulture, il motore di associazione utilizza la Language proprietà dell'oggetto di destinazione dell'associazione. 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.

  • 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. Per altre informazioni, vedere la sezione "Utilizzo di oggetti interi come origine di associazione" in Cenni preliminari sulle origini di associazione.

  • Il valore predefinito Mode varia tra unidirezionale e bidirezionale a seconda della proprietà di dipendenza associata. È sempre possibile dichiarare in modo esplicito la modalità di associazione per garantire che il comportamento sia quello desiderato. In generale, le proprietà del controllo modificabili dall'utente, ad esempio TextBox.Text e RangeBase.Value, per impostazione predefinita sono associazioni bidirezionali, mentre per la maggior parte delle altre proprietà vengono predefinite associazioni unidirezionale.

  • Il valore predefinito UpdateSourceTrigger varia anche tra PropertyChanged e LostFocus a seconda della proprietà di dipendenza associata. Il valore predefinito per la maggior parte delle proprietà di dipendenza è PropertyChanged, mentre la proprietà TextBox.Text ha il valore predefinito LostFocus.

Vedi anche