2009-02-20 8 views
5

Ok, Quindi sono stato bloccato nel mio ultimo progetto non di lavoro, cercando di utilizzare WPF. Sono sinceramente infastidito dal databinding. Pensavo che avrebbe dovuto semplificare le cose legando i dati direttamente all'interfaccia utente. Ma più imparo sull'implementazione di INotifyPropertyChanged per far sì che le cose vengano notificate all'interfaccia utente, se cambiano, sembra rendere tutto controproducente.Il databinding WPF rende le cose più dolorose di quanto valga?

Mi manca qualcosa? Sembra un po 'di lavoro e dover rendere le classi implementate INotifyPropertyChanged sembra un modo per catturare i dati sul lavoro.

Cosa mi manca? Devo mancare qualcosa. Per favore chiariscimi su come rendere facile il databinding, o per lo meno semplice.

risposta

4

Se si desidera che l'interfaccia utente venga notificata quando cambia l'origine dati sottostante, è necessario il tipo di meccanismo di notifica10 per il tipo di notifica . Per WPF, INotifyPropertyChanged è quel meccanismo.

È lo stesso anche in Windows Form, ma Windows Form supporta anche il vecchio meccanismo di notifica, in cui è presente un evento con il nome <Property>Changed.

Tuttavia, nessuno di questi ha richiesto questi meccanismi se tutto ciò che si vuole fare è legare i dati una volta e visualizzarli.

Se non si ricevono notifiche, è sufficiente collegarsi all'origine dati e funzionerà.

+0

Quindi, ogni volta che una proprietà di una classe cambia, dobbiamo farlo sollevare l'evento PropertyChanged? Sembra noioso. Cosa succede se non abbiamo nemmeno il codice per la classe che vogliamo associare? Questo non è complicato? –

+0

GordonG, questo è il punto in cui il modello Model-View-ViewModel è altamente raccomandato. Il tuo ViewModel (livello intermedio) lo gestisce essenzialmente consentendoti di esporre nuovamente le proprietà del modello sottostante, ma il tuo View mostra le proprietà re-esposte del ViewModel (NON quelle del modello!). – Adrian

+0

(continua dall'alto) Il tuo ViewModel implementa INotifyPropertyChanged e per le chiamate 'get' devi solo restituire il valore per la proprietà del modello sottostante, ma su 'set' call, entrambi impostate il valore della proprietà del modello sottostante E si attiva PropertyChanged in modo che la Vista veda il valore aggiornato. – Adrian

4

A dire il vero, non ho visto che fosse così male, e penso che sia una soluzione altamente praticabile.

prendere questa semplice, oggetto Modello di dati:

Public Class SimpleItemViewModel 
Implements INotifyPropertyChanged 

Private _item As String 
Public Property Item As String 
    Get 
     return _item 
    End Get 
    Set (value as string) 
     _item = value : OnPropertyChanged("Item") 
    End Set 
End Property 

Protected Overridable Sub OnPropertyChanged(propChange as string) 
    Raise Event PropertChanged(me, new PropertyChangedEventArgs(propChange)) 
End Sub 
Public Event PropertyChanged(sender as object, e as PropertyChangedEventArgs) 
End Class 

che può essere facilmente associato a una semplice casella di testo tramite:

<Textbox Text="{Binding Item}" /> 

Inoltre, se volevo avere una bandiera SPORCO, posso facilmente metti il ​​flag impostato nel sub di OnPropertyChanged, e facilmente determinare se ho bisogno di salvare eventuali modifiche dell'utente o meno.

Ho trovato più facile avere un set di classi che si trovano tra il livello di accesso ai dati e l'interfaccia utente che contiene questa roba. Puoi persino far sì che la tua business logic e DAL superino queste classi piuttosto che i valori atomici.

+0

Ricorda che il testo sopra = "{Binding Item}" funziona a causa dell'idea di un contesto di dati ereditato. Il contesto dati della tua vista è il ViewModel. – Adrian

+0

La sintassi precedente è dettagliata, ma consente di attivare gli eventi PropertyChanged a piacere. È possibile attivare diversi eventi di questo tipo quando si imposta un valore (forse le altre proprietà modificate hanno solo getter perché sono proprietà calcolate). – Adrian

+0

KP - Esatto. Inoltre, se si dispone di controlli secondari o di contenitori, è possibile assegnare a livello di programmazione di modelli di visualizzazione aggiuntivi al contesto di tali dati del contenitore. –

0

DataBinding è l'unico modo per implementare un modello di visualizzazione modello in WPF/Silverlight. I tuoi modelli possono essere UI-stupidi implementando INotifyPropertyChanged, che li isola dall'interfaccia utente. Inoltre salva un sacco di codice UI quando inserisce informazioni nell'interfaccia utente.

Un altro vantaggio di cui mi diverto è la possibilità di associare ulteriormente i controlli figlio agli stessi dati utilizzando la scorciatoia {Binding}.

0

Innanzitutto, INotifyPropertyChanged non è l'unico modo per ottenere il binding dei dati al lavoro: anche le proprietà di dipendenza funzionano.

In secondo luogo, INotifyPropertyChanged può essere implementato con una sola riga di codice nella classe di entità, se si utilizza AOP - non è necessario effettuare tutte queste chiamate di notifica.

Nel complesso, direi che l'associazione dei dati è un grande vantaggio, specialmente quando si sta eseguendo la generazione del codice per eseguire automaticamente i controlli associati da alcune origini dati.

2

L'implementazione di INotifyProperty non è particolarmente difficile, poiché ha un solo membro.

Se non si prevedono modifiche nell'oggetto sottostante, non preoccuparsi di INotifyProperty modificato e utilizzare un collegamento con Mode=OneTime.

Se l'oggetto sottostante può cambiare e si desidera che la GUI rifletta tali modifiche, allora in che modo è possibile ottenere altro senza il tipo di notifica fornito da INotifyProperty? Non è ragionevole aspettarsi che un oggetto legato scriva la fonte della sua associazione.

Personalmente ho trovato che WPF ha impiegato del tempo per fare i conti, ma ora che sto ottenendo conforto lo trovo incredibilmente potente e piacevole da lavorare. Incoraggio chiunque stia trovando WPF difficile da mantenere.

0

Se stai cercando un buon modo per pensare a strutturare l'associazione dei dati, punta a impostare DataContext sull'albero logico solo una volta, quindi utilizza i percorsi di associazione per popolare le varie parti dell'interfaccia utente.

0

Siate il più dichiarativi possibile nella vostra rilegatura. Lascia che il sistema di template faccia il suo lavoro e faccia un uso pesante di DataTemplate s che specifichi esplicitamente DataType s.

1

Il binding in XAML è abbastanza semplice, tuttavia, l'associazione dinamica dei dati WPF nel codice è dolorosa e confusa.

+0

Quindi non sono io, dopotutto! –

Problemi correlati