2010-01-15 17 views
20

Sono in procinto di apprendere WPF e sono perplesso dal fatto che le eccezioni del database non causano un'eccezione di runtime/non gestita.Perché WPF inceppare le eccezioni del databinding?

Qualcuno può spiegare i vantaggi dell'elaborazione dati lavorando in questo modo? Suppongo che ci siano i vantaggi, ma fino ad ora non ne vedo alcuno (disclaimer: sto solo iniziando con l'associazione dati).

I collegamenti alle risorse che spiegano le ragioni teoriche (o pratiche) per prendere questa decisione funzionerebbero altrettanto bene.

+1

Dupe: http://stackoverflow.com/questions/978887/why- does-wpf-databinding-swallow-exceptions –

+1

Non un dupe. Questa domanda riguarda il perché, la domanda collegata riguarda cosa fare al riguardo. –

+0

La prima risposta nella domanda collegata spiega cosa fare al riguardo. Fonti di tracciamento personalizzato ftw. –

risposta

9

I don lo so per certo, ma ho il sospetto che sia perché non c'è nessun luogo dove gestire l'eccezione.

Supponiamo di avere qualcosa a cui si desidera associare le proprietà, ma a volte qualcosa è nullo. (Ad esempio, {Binding Name.Length}, dove Nome è una proprietà stringa che potrebbe essere nullo.) In questo caso sei contento che questo sia un no-op, perché sai che il controllo non verrà mai mostrato quando il Nome è nullo (dovuto a un trigger dire) o perché sai che questa sarà una condizione transitoria mentre la fonte di binding sta caricando i suoi dati.

Supponiamo ora che WPF abbia propagato la NullReferenceException durante il tentativo di chiamare Length sulla stringa Nome null. Nel codice procedurale, prenderesti questa eccezione e la inghiottire perché sapevi che era benigno. Ma non è possibile inserire un gestore di eccezioni attorno al codice di binding WPF. Viene chiamato da qualche parte in profondità all'interno di WPF. Quindi l'eccezione dovrebbe arrivare fino a Application.Run, che non è un posto molto utile per catturarlo.

Quindi piuttosto che farvi centralizzare i gestori di eccezioni di binding fino in Application.Run, penso che i membri del WPF abbiano deciso di ingoiare le eccezioni da soli. Solo una teoria però ...

+1

I ' Non sono sicuro di essere d'accordo: tecnicamente, l'elemento 'Binding' ha solo un percorso di stringa che viene successivamente convertito in un'istanza di' PropertyPath', che a sua volta verrebbe utilizzato per navigare fino alla proprietà di destinazione. probabilmente ha senso che questo navigatore controlli null ogni passo del percorso e lo restituisca ogni volta che viene raggiunto, ciò che rimane altamente discutibile è come gestisce le * effettive * eccezioni generate dai getter di proprietà che vengono visitati. una ricetta per la catastrofe. – Crono

4

Non so perché questo è il comportamento predefinito, ma ci sono modi per aggirare.

Ad esempio, anche se non viene indicato l'errore di associazione, verrà visualizzata la finestra Output. Puoi farlo anche usando le convalide vincolanti.

EDIT: Ho trovato this articolo che ha una buona idea di creare casi di test che cattura quei fastidiosi errori di associazione silenziose (e mi è piaciuto la foto in cima all'articolo)

+0

In effetti, è possibile vedere l'eccezione Binding nella finestra Output in fase di esecuzione.Sapete se è possibile conoscere anche le eccezioni che si verificano in fase di progettazione (ad esempio in Blend)? –

+0

Link non più valido – Neil

5

Direi che è perché il costo di produrre un'eccezione è proibitivo. L'implementazione corrente funziona anche nel caso in cui vi siano alcuni binding non validi e nella forma attuale che possono effettivamente avere un effetto molto significativo sulle prestazioni. Prendi questo esempio, crea un DataGrid che esegue il binding e questo carica 1.000 record in esso. Misurare le prestazioni con tutti gli attacchi corretti e di nuovo con uno di loro sbagliato. La differenza è notevole. Aggiungi sopra quelle istanze di classi di eccezioni in piedi e potrebbe andare fuori controllo male. Solo la mia opinione.

+0

Pensiero interessante! Non avevo considerato il problema perfetto di catturare e gestire l'eccezione per ogni elemento di un controllo di elenco ... – itowlson

+0

Bah, volevo sviare questo, ma ho accidentalmente "rimosso" l'upvot e ora non riesco a fare nuovamente clic su ripristinare il mio upvote. Scusa, Keith - virtuale +1 comunque! Il binding – itowlson

+0

con binding errati è lento a causa del messaggio di avviso visualizzato nella finestra di output in Visual Studio; la finestra di output è molto lenta –

0

Ecco collegamento a un blog post in cui il blogger scrive di un caso in cui si sostiene che non ha senso che gli errori di rilegatura sono silenziosi

Problemi correlati