4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>
Miglioramenti per il DataBinding
Benché WPF disponga, fin dalla sua prima versione, di uno dei sistemi più versatili e potenti, per creare e mantenere un collegamento stabile e reattivo tra logica business della nostra applicazione e l'interfaccia utente, sono stati apportati alcuni lievi miglioramenti anche in questo settore, tutti volti a migliorare o semplificare il compito dello sviluppatore, ad esempio facilitando il Debug delle espressioni di DataBinding e semplificando la validazione dei dati inseriti dall'utente.
La classe PresentationTraceSources già presente nella versione 3.0 del .NET Framework si arricchisce di un nuovo membro: TraceLevel, una DependecyProperty che permette di impostare a livello di singola espressione di binding il dettaglio delle informazioni riportare dalla finestra "output" di Visual Studio durante la fase di debug.
Per impostare il livello di dettagli dobbiamo per prima cosa aggiungere il namespace System.Diagnostics tra quelli utilizzabili direttamente nel markup.
xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"In seguito modifichiamo la nostra espressione di binding:
<Binding Path="BestReviewGame.Vote" UpdateSourceTrigger="PropertyChanged" diag:PresentationTraceSources.TraceLevel="High" >A questo punto è sufficiente lanciare la nostra applicazione in modalità debug per vedere tracciato nella finestra di output tutte le informazioni relative al DataBinding.
I livelli di dettaglio disponibili sono quattro: None, Low, Medium e High.
Impostando la proprietà a None, nessun dettaglio viene tracciato, ma possiamo aumentare il livello dei dettagli fino ad arrivare ad High, mediante il quale otteniamo un rapporto dettagliato su ogni singola operazione compiuta durante la valutazione dell'espressione di binding.
Come accennato, le novità nel sistema di DataBinding non si fermano al "semplice" miglioramento dell'esperienza di debug, adesso il modello di validazione dei dati ci consente, mediante la classe DataErrorValidationRule , di intercettare l'eccezioni lanciate dall'implementazione dell'interfaccia presente fin dal .NET Framework 1.0, IDataErrorInfo.
L'interfaccia IDataErrorInfo dichiara un indicizzatore che durante la fase di validazione riceve il nome della proprietà da validare e restituisce l'eventuale messaggio d'errore:
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
namespace MyGamePlace
{
public class GameReview : IDataErrorInfo
{
private Game _game;
private string _review;
private int _vote;
public virtual Game Game
{
get
{
return _game;
}
set
{
_game = value;
}
}
public virtual string Review
{
get
{
return _review;
}
set
{
_review = value;
}
}
public virtual int Vote
{
get
{
return _vote;
}
set
{
_vote = value;
}
}
#region IDataErrorInfo Members
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get
{
if (columnName == "Vote")
{
if (Vote < 1 | Vote > 10)
{
return "Il voto deve essere compreso tra 1 e 10";
}
}
return null;
}
}
#endregion
}
}
Nell'esempio precedente, durante la fase di validazione controlliamo che il valore immesso sia compreso tra 1 e 10 e se la validazione ha esito negativo viene restituito il messaggio d'errore.
Proseguiamo creando l'interfaccia per la modifica dei dati esposti dalla classe:

Di seguito è riportato il frammento del markup contenente le regole di validazione applicate all'espressione di binding, tra le regole è stato aggiunto il tipo DataErrorValidationRule mediante il quale possiamo controllare le eccezioni sollevate mediante l'implementazione dell'interfaccia IDataErrorInfo, mentre la classe ExceptionValidationRule, già presente nella versione 3.0 del frame work, controlla ogni eccezione sollevata durante la fase di aggiornamento.
<TextBox Name="TextBoxVoto" Grid.ColumnSpan="2" Grid.Row="1" VerticalAlignment="Top" Height="21.96" Margin="60,10,10,0" Style="{StaticResource ErroStyle}" >
<TextBox.Text>
<Binding Path="BestReviewGame.Vote" UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<ExceptionValidationRule />
<DataErrorValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
Introducendo un valore non valido, l'interfaccia fornisce il feedback necessario a informare l'utente; per il codice completo si veda l'esempio allegato.

Al fine di rendere la precedente sintassi più concisa e limitare al minimo le righe di Markup, in questo caso ripetitive e scontate, la classe Binding espone adesso due nuove proprietà ValidatesOnDataErrors e ValidatesOnExceptions. Il markup precedente può essere riscritto, come mostra il frammento di codice seguente, senza alterarne il funzionamento, utilizzando queste due nuove proprietà:
<TextBox Name="TextBoxVoto" Grid.ColumnSpan="2" Grid.Row="1" VerticalAlignment="Top" Height="21.96" Margin="60,10,10,0" Style="{StaticResource ErroStyle}" >
<TextBox.Text>
<Binding Path="BestReviewGame.Vote" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnExceptions="True" />
</TextBox.Text>
</TextBox>
4 pagine in totale: <<Indietro 1 [2] 3 4 Avanti >>
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.





Difficoltà

Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!
