L'arrivo di un "novellino" alle prime armi del calibro di Mauro Servienti nell'arena WPF mi da una strana sensazione (oserei dire eccitazione ma evito per paura di essere frainteso). Sono certo che ora il framework WPF verrà vivisezionato, analizzato in ogni sua parte, rivoltato come un calzino, sino a comprenderne la sua più intima essenza! Allora, tanto per dare la stura, inizio io.
Premetto che dopo averci tanto litigato, ora sono completamente addicted: WPF forever! Ma ciò non significa che anch'io non provi a stressarlo un po'... con una serie di test, derivati dalla mia casistica d'uso.
Siccome l'argomento è un po' lungo, lo dividerò in varie puntate (attirandomi l'odio di alcuni e le simpatie di altri, in particolare di quelli che non vogliono "scrollare" la pagina per mezzora per saltare il mio post a pié pari per passare al prossimo post).
Eccovi quindi la 1° parte:
Quello che voglio mostrare è uno strano comportamento di WPF per quanto riguarda il testo di una TextBox "bindato" alla proprietà Codice di una istanza della classe Prodotto.
Per mostrarvelo, ho creato una piccola applicazione WPF che utilizzeremo come laboratorio:
con alcuni "strumenti" per evidenziare il comportamento di WPF.
Vedremo come, una volta bindati i campi della finestra WPF alle relative proprietà pubbliche di un oggetto della classe Prodotto, il campo Codice non si comporterà secondo le nostre aspettative e dovremo usare un workaround per risolvere la questione.
Ma andiamo per ordine. Ipotizziamo di avere un magazzino prodotti, in cui il prodotto è identificato da un codice così composto:
Per comodità, nell'interfaccia utente vogliamo consentire l'uso del punto tra la Sottocategoria e il LocalID per evitare di dover inserire tutti gli zeri del codice prodotto (ad esempio: inserire come codice 19.3 dev'essere equivalente a inserire il codice 10900003).
Per gestire questo comportamento ipotizziamo di aver creato una classe Prodotto che implementa INotifyPropertyChanged :
Di cui segue il sorgente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace TPCWare.WPF_Lab.Test1
{
class Prodotto: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
// PropertyChangedEventHandler propertyChangedEventHandler = PropertyChanged;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private String codice;
private String descrizione;
public String Codice
{
get { return codice; }
set
{
codice = Prodotto.FormattaCodice(value);
// Call NotifyPropertyChanged whenever the property is updated
NotifyPropertyChanged("Codice");
}
}
public String Descrizione
{
get { return descrizione; }
set
{
if (value != descrizione)
{
descrizione = value;
// Call NotifyPropertyChanged whenever the property is updated
NotifyPropertyChanged("DescrizioneConto");
}
}
}
public static string FormattaCodice(string value)
{
String s = value;
if (s.IndexOf('.') == 2)
{
s = s.Insert(1, "0");
}
if (s.IndexOf('.') == 3)
{
s = s.Substring(0, 4) + s.Substring(4, s.Length - 4).PadLeft(5, '0');
}
return s;
}
public static bool CodiceValido(string codice)
{
return (Regex.IsMatch(codice, @"^[1-49][0-9][0-9][.][0-9][0-9][0-9][0-9][0-9]")
&& (codice.Substring(1, 2) != "00"));
}
public Prodotto(string codice, string descrizione)
{
this.Codice = codice;
this.Descrizione = descrizione;
}
}
}
Nella prossima parte vedremo come istanziare da XAML un oggetto di classe prodotto, come bindare i campi della finestra WPF al prodotto, qual'è il comportamento anomalo a cui mi riferivo ed altre amenità varie.
posted @ sabato 8 novembre 2008 18:18