Bug Silverlight WPF Converter don’t refresh

Qualche giorno fa ho scoperto un bellissimo bug, che poi bug non e’ ma il risultato finale e’ pietoso.
Se il nostro oggetto ha una proprieta MinutiLavorati e applichiamo un converter che converta i minuti in hh:mm tutto funziona correttamente (non si puo’ applicare stringFormat).

Se un utente inserisce 10:15 tutto funziona correttmente. Se invece inserisce 10 e basta si vuole che questo valore venga convertito in 10:00.
Il converter che ho scritto prende il valore 10 e lo moltiplica per 60 e non trovando i minuti torna come risultato della funzione ConvertBack 600.
Il valore viene salvato nella proprieta’ su cui era bindato in “TwoWay”, invocando la set col NUOVO valore viene chiamato RaisePropertyChanged.
La textbox rilegge la property col nuovo valore (600) e viene chiamato il metodo Convert del Converter che restituisce la stringa “10:00”, e che verra’ mostrata nella TextBox

Tutto perfetto fino qui..

Ora se io inserisco un valore diverso ogni volta tutto funziona come sopra descritto
MA (c’e’ sempre un MA 🙂 )
se inserisco di nuovo lo stesso valore 10, viene chiamato ConvertBack proprio come prima, ritorna 600 e viene invocato la set dell’ oggetto.

Quando la property su cui siamo in binding e’ generata dal reference di un web service o da alcuni snippet e o framework avremmo questo codice (preso dal reference.cs del mio progetto)

[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, Order=7)]
public int MinutiLavorati {
    get {
        return this.MinutiLavoratiField;
    }
    set {
        if ((this.MinutiLavoratiField.Equals(value) != true)) {
            this.MinutiLavoratiField = value;
            this.RaisePropertyChanged("MinutiLavorati");
        }
    }
}

Alla set viene passato 600, il valore e’ uguale al valore esitente nella variabile interna e quindi non viene riassegnato e non viene invocato RaisePropertyChanged.
Questo ovviamente non scatena l’ esecuzione del metodo Convert del Converter e il risultato (orribile) e’ che nella textbox rimanga il numero “10” e non venga convertito in 10:00

L’ unica strada che ho trovato (non elegante):
Essendo la classe generata partial possiamo estendere la classe creandone un’ altra partial con una proprieta’ “fake” che esegue lo stesso codice della precedente eliminando la riga di controllo del valore.

[System.Runtime.Serialization.DataMemberAttribute(IsRequired=true, Order=7)]
public int MinutiLavoratiWrapper {
    get {
        return this.MinutiLavoratiField;
    }
    set {

        this.MinutiLavoratiField = value;
        this.RaisePropertyChanged("MinutiLavorati");
    }
}

Ora ovviamente il binding deve essere fatto su questa property

Annunci

Informazioni su Andrea Regoli

Project Manager .Net Developer WPF WP7 Asp.Net c# javascript ajax SQL sharepoint
Questa voce è stata pubblicata in .Net, Silverlight, WPF, xaml e contrassegnata con , , , , . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...