[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 @ domenica 23 novembre 2008 01:24

Print

Comments on this entry:

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

Left by Corrado Cavalli at 23/11/2008 02: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'.
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011