Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La visualizzazione e la modifica dei dati reali nell'interfaccia utente sono fondamentali per la funzionalità di molte app. Questo articolo illustra le informazioni necessarie per visualizzare una raccolta di oggetti Customer in un elenco.
Questa non è un'esercitazione. Se ne desideri una, consulta il nostro tutorial sul data binding , che fornirà un'esperienza guidata passo passo.
Si inizierà con una rapida descrizione del data binding: che cos'è e come funziona. Aggiungeremo quindi un ListView all'interfaccia utente, implementeremo l'associazione dati e la personalizzeremo con funzionalità aggiuntive.
Cosa c'è da sapere?
Il data binding è un modo per visualizzare i dati di un'app nell'interfaccia utente. Ciò consente separazione dei problemi nell'app, mantenendo l'interfaccia utente separata dall'altro codice. In questo modo viene creato un modello concettuale più pulito che è più facile da leggere e gestire.
Ogni data binding ha due parti:
- La fonte che fornisce i dati da associare.
- Destinazione nell'interfaccia utente in cui vengono visualizzati i dati.
Per implementare un'associazione dati, è necessario aggiungere codice alla sorgente che mette a disposizione i dati per il binding. Dovrai anche aggiungere una delle due estensioni di markup al codice XAML per specificare le proprietà dell'origine dati. Ecco la differenza principale tra i due:
- x:Bind è fortemente tipizzato e genera codice in fase di compilazione per ottenere prestazioni migliori. Di default, x:Bind è un binding a una sola esecuzione, che ottimizza per la rapida visualizzazione di dati di sola lettura che non cambiano.
- legatura è debolmente tipizzata e assemblata in fase di esecuzione. Ciò comporta prestazioni inferiori rispetto a x:Bind. In quasi tutti i casi, è consigliabile usare x:Bind invece di Binding. Tuttavia, è probabile che venga incontrato nel vecchio codice. L'associazione per impostazione predefinita utilizza un trasferimento di dati unidirezionale, ottimizzando così i dati di sola lettura che possono variare all'origine.
È consigliabile usare x:Bind quando possibile e verrà visualizzato nei frammenti di codice di questo articolo. Per altre informazioni sulle differenze, vedere confronto delle funzionalità {x:Bind} e {Binding}.
Creare un'origine dati
Prima di tutto, è necessaria una classe per rappresentare i dati del cliente. Per fornire un punto di riferimento, illustreremo il processo in questo esempio essenziale:
public class Customer
{
public string Name { get; set; }
}
Creazione di un elenco
Prima di poter visualizzare tutti i clienti, è necessario creare l'elenco per conservarli. La visualizzazione elenco è un controllo XAML di base ideale per questa attività. Il controllo ListView richiede attualmente una posizione nella pagina e richiederà a breve un valore per la relativa proprietà ItemSource .
<ListView ItemsSource=""
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
Dopo aver associato i dati a ListView, è consigliabile tornare alla documentazione e sperimentare la personalizzazione dell'aspetto e del layout in base alle proprie esigenze.
Associare i dati all'elenco
Dopo aver creato un'interfaccia utente di base per gestire le associazioni, è necessario configurare la sorgente per fornirle. Ecco un esempio di come eseguire questa operazione:
public sealed partial class MainPage : Page
{
public ObservableCollection<Customer> Customers { get; }
= new ObservableCollection<Customer>();
public MainPage()
{
this.InitializeComponent();
// Add some customers
this.Customers.Add(new Customer() { Name = "NAME1"});
this.Customers.Add(new Customer() { Name = "NAME2"});
this.Customers.Add(new Customer() { Name = "NAME3"});
}
}
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBlock Text="{x:Bind Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
La panoramica del data binding illustra un problema simile, nella sezione relativa all'associazione a una raccolta di elementi. L'esempio seguente illustra i passaggi cruciali seguenti:
- Nel code-behind dell'interfaccia utente, crea una proprietà di tipo ObservableCollection<T> per contenere gli oggetti 'Customer'.
- Associare il ItemSource di
listView a tale proprietà. - Specificare un ItemTemp late di base per ListView, che consente di configurare la modalità di visualizzazione di ogni elemento nell'elenco.
È possibile consultare la documentazione sulla visualizzazione elenco se si desidera personalizzare il layout, aggiungere la selezione degli articoli o modificare il DataTemplate appena creato. Ma cosa succede se vuoi modificare i tuoi clienti?
Modifica i Clienti tramite l'interfaccia utente
Hai visualizzato i clienti in un elenco, ma il data binding ti consente di fare di più. Cosa succede se è possibile modificare i dati direttamente dall'interfaccia utente? A tale scopo, si esaminerà prima di tutto le tre modalità di data binding:
- "una sola volta": questo data binding si attiva una sola volta e non reagisce alle modifiche.
- unidirezionale: questo data binding aggiornerà l'interfaccia utente ogni volta che vengono apportate modifiche all'origine dati.
- Bidirezionale: Questo legame dati aggiornerà la UI con le modifiche apportate all'origine dati, e aggiornerà anche i dati con eventuali modifiche effettuate nella UI.
Se sono stati seguiti i frammenti di codice precedenti, l'associazione effettuata usa x:Bind e non specifica una modalità, rendendola un'associazione One-Time. Se vuoi modificare i tuoi clienti direttamente dall'interfaccia utente, dovrai modificarla in un binding Two-Way, in modo che le modifiche dai dati vengano passate agli oggetti Cliente. data binding in modo approfondito contiene altre informazioni.
Il binding bidirezionale aggiornerà anche l'interfaccia utente se l'origine dati viene modificata. Affinché ciò funzioni, è necessario implementare INotifyPropertyChanged nella sorgente e assicurarsi che i relativi metodi setter delle proprietà generino l'evento PropertyChanged. La pratica comune consiste nel far chiamare un metodo di supporto come il metodo OnPropertyChanged, come illustrato di seguito:
public class Customer : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
this.OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Rendere quindi modificabile il testo in ListView usando un
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBox Text="{x:Bind Name, Mode=TwoWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Un modo rapido per assicurarsi che funzioni è aggiungere un secondo ListView con controlli TextBox e associazioni OneWay. I valori nel secondo elenco verranno modificati automaticamente durante la modifica della prima.
Annotazioni
La modifica direttamente all'interno di un controllo ListView è un modo semplice per mostrare Two-Way binding in azione, ma può causare complicazioni di usabilità. Se vuoi espandere la funzionalità della tua app, prendi in considerazione l'uso di altri controlli XAML per modificare i tuoi dati e mantenere ListView come sola visualizzazione.
Andare oltre
Ora che hai creato un elenco di clienti con binding bidirezionale, puoi tornare alla documentazione che ti abbiamo fornito e sperimentare. Puoi anche consultare la nostra esercitazione sul binding dei dati se desideri una guida passo-passo sui binding di base e avanzati, oppure esaminare controlli come il modello elenco/dettagli per realizzare un'interfaccia utente più solida.
API e documenti utili
Di seguito è riportato un breve riepilogo delle API e di altre utili documentazione che consentono di iniziare a usare il data binding.
API utili
| API (Interfaccia di Programmazione delle Applicazioni) | Descrizione |
|---|---|
| modello di dati | Descrive la struttura visiva di un oggetto dati, consentendo la visualizzazione di elementi specifici nell'interfaccia utente. |
| x:Bind | Documentazione sull'estensione di markup x:Bind consigliata. |
| Rilegatura | Documentazione sull'estensione di markup binding precedente. |
| ListView | Controllo dell'interfaccia utente che visualizza gli elementi di dati in uno stack verticale. |
| Casella di testo | Controllo di testo di base per la visualizzazione di dati di testo modificabili nell'interfaccia utente. |
| INotifyPropertyChanged | Interfaccia per rendere osservabili i dati, fornendoli a un data binding. |
| ControllaOggetti | La proprietà ItemsSource di questa classe consente a un controllo ListView di associarsi a un'origine dati. |
Documentazione utile
| Argomento | Descrizione |
|---|---|
| Associazione dati in profondità | Panoramica di base dei principi di data binding |
| Panoramica del Data Binding | Informazioni concettuali dettagliate sul data binding. |
| Visualizzazione Elenco | Informazioni sulla creazione e configurazione di un ListView, inclusa l'implementazione di un DataTemplate |
Esempi di codice utili
| Esempio di codice | Descrizione |
|---|---|
| esercitazione sull'associazione dati | Un'esperienza guidata passo passo attraverso le nozioni di base dell'associazione dati. |
| ListView e GridView | Esplorare visualizzazioni ListView più elaborate con il data binding. |
| QuizGame | Vedere data binding in azione, inclusa la classe BindableBase |