[WPF] Come litigare con INotifyPropertyChanged e vivere felici

Collegare una proprietà di una classe ad un elemento di WPF implementando INotifyPropertyChanged è facilissimo da fare (anche se verboso) quando abbiamo una nostra classe, ma diventa "un po' antipatico" in casi leggermente più complessi. Mi ci sono impuntato scrivendo una piccolissima applicazione di data logging che deve ricevere e registrare i dati provenienti da una bilancia via RS232.

DataLogger 

Per farla semplice: ho una classe Bilancia che ha un campo comPort di tipo SerialPort e una proprietà ComPort { get; }

Il problema nasce dal fatto che la classe SerialPort non è stata pensata per essere "WPF friendly" e non implementa INotifyPropertyChanged e questo mi crea problemi perchè vorrei bindare la TextBox relativa alla porta com utilizzata con il valore di bilancia.ComPort.PortName

Per risolvere la questione dovrei creare una classe che estende SerialPort, a cui far implementare l'interfaccia INotifyPropertyChanged ma lo devo fare wrappando la classe perchè non è possibile eseguire l'override del membro ereditato 'System.IO.Ports.SerialPort.PortName.get' visto che non è contrassegnato come virtual, abstract o override (copiato paro paro dal messaggio di errore di Visual Studio).

Per giunta, a rendere la questione ancora più ingarbugliata, c'è il post Is INotifyPropertyChanged an anti-pattern? di Neil Mosafi che è molto interessante e provocante, insieme al post INotifyPropertyChanged -- Searching for a Better Way di Jeff Handley.

Maremma scribacchina, non si finisce mai di studiare! Quando pensi di aver capito qualcosa e di poterlo applicare sempre e con facilità, giri l'angolo e trovi subito un caso d'uso che ti complica la vita.

posted @ sabato 22 novembre 2008 23.24

Print

Comments on this entry:

# re: [WPF] Come litigare con INotifyPropertyChanged e vivere felici

Left by Corrado Cavalli at 23/11/2008 0.45
Gravatar
Ecco perche per me WPF=M-V-VM tutta la vita, ti crei un BilanciaViewModel che implementa INotifyPropertyChanged ed espone quello che serve alla tua UI e mappa le relative properties verso le reali implementazioni (ad esempio ComPort mappa su SerialPort.Comport.PortName) e usa i comandi per delegare le funzionalita'.

# re: [WPF] Come litigare con INotifyPropertyChanged e vivere felici

Left by Nicolò Carandini at 23/11/2008 9.40
Gravatar
Oh yeah! Non ho ancora studiato M-V-VM ma devo averlo già nel sangue ;-)
Infatti su Bilancia ho creato una proprietà ComPortName che wrappa _comPort.PortName .
Una roba casereccia che risolve il problema. Ora vado a scaricarmi le tue demo e mi vedo le slides, per poi riscrivere l'applicazione a la "M-V-VM"!
Grazie per il commento.
Comments have been closed on this topic.