2009-02-20 18 views
5

Ok, Así que me he estancado en mi último proyecto no laboral, tratando de usar WPF. Estoy francamente molesto por la databinding. Pensé que se suponía que debía simplificar las cosas vinculando los datos directamente a la interfaz de usuario. Pero cuanto más aprendo sobre la necesidad de implementar INotifyPropertyChanged para que las cosas notifiquen a la UI si han cambiado, parece que todo el proceso es productivo.¿El enlace de datos de WPF hace que las cosas sean más dolorosas de lo que valen?

¿Echo de menos algo? Parece que un montón de trabajo y tener que hacer que las clases implementadas INotifyPropertyChanged parezcan una manera sospechosa de poner en marcha el enlace de datos.

¿Qué me estoy perdiendo? Debo estar perdiendo algo. Por favor, infórmeme sobre cómo hacer que la vinculación de datos sea sencilla o, al menos, directa.

Respuesta

4

Si desea que la interfaz de usuario reciba una notificación cuando la fuente de datos subyacente cambie, entonces necesita algún tipo de mecanismo de notificación. Para WPF, INotifyPropertyChanged es ese mecanismo.

Pasa lo mismo en Windows Forms, pero Windows Forms también es compatible con el antiguo mecanismo de notificación, donde tiene un evento con el nombre <Property>Changed.

Sin embargo, ninguno de estos requirió estos mecanismos si todo lo que desea hacer es vincular los datos una vez y mostrarlos.

Si no está recibiendo notificaciones, simplemente conéctese a la fuente de datos y funcionará.

+0

De modo que cada vez que una propiedad de una clase cambia, tenemos que hacer que eleve el evento PropertyChanged? Eso parece tedioso ¿Qué sucede si ni siquiera tenemos el código para la clase a la que queremos vincularnos? ¿Esto no se ensucia? –

+0

GordonG, aquí es donde se recomienda encarecidamente el modelo Model-View-ViewModel. Su ViewModel (capa intermedia) básicamente maneja esto permitiéndole volver a exponer las propiedades subyacentes del Modelo, pero su información de Vista se une a las propiedades reexpuestas del ViewModel (¡NO el modelo!). – Adrian

+0

(continúa desde arriba) Su ViewModel implementa INotifyPropertyChanged y para las llamadas 'get' solo devuelve el valor por propiedad del modelo subyacente, pero en llamadas 'configuradas', ambos establecen el valor de propiedad del modelo subyacente Y activa PropertyChanged para que View vea el valor actualizado. – Adrian

4

A decir verdad, no he visto que sea tan malo, y creo que es una solución muy viable.

Tome este sencillo, objeto Modelo de datos:

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 

que se une fácilmente a un simple cuadro de texto a través de:

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

Además, si quería tener una bandera sucia, puede fácilmente pongo la bandera en el sub En OnDepertyChanged, y determina fácilmente si necesito guardar los cambios del usuario o no.

He encontrado que es más fácil tener un conjunto de clases que descansan entre la capa de acceso a datos y la interfaz de usuario que contiene estas cosas. Incluso puede hacer que su lógica de negocios y DAL pasen estas clases en lugar de los valores atómicos.

+0

Solo recuerde que el texto anterior = "{Elemento de enlace}" funciona debido a la idea de un contexto de datos heredado. El contexto de datos de su Vista ES el ViewModel. – Adrian

+0

La sintaxis anterior es detallada, pero le permite activar eventos PropertyChanged a voluntad. Puede disparar varios de estos eventos cuando establece un valor (tal vez las otras propiedades que cambian solo tienen captadores porque son propiedades calculadas). – Adrian

+0

KP - Exactamente. Además, si tiene subcontroles o incluso contenedores, puede asignar modelos de vista adicionales al contexto de datos de ese contenedor mediante programación. –

0

DataBinding es la única manera de implementar un patrón de vista de modelo en WPF/Silverlight. Sus modelos pueden ser estúpidos para la UI al implementar INotifyPropertyChanged, que los aísla de la IU. También ahorra una gran cantidad de código de UI al rellenar información en la interfaz de usuario.

Otro beneficio que disfruto es la capacidad de vincular aún más controles secundarios con los mismos datos utilizando el atajo {Binding}.

0

En primer lugar, INotifyPropertyChanged no es la única forma de hacer que el enlace de datos funcione, las propiedades de dependencia también funcionan.

En segundo lugar, INotifyPropertyChanged puede implementarse con solo una línea de código en su clase de entidad, si utiliza AOP - en realidad no tiene que hacer todas esas llamadas de notificación usted mismo.

En general, yo diría que el enlace de datos es una gran ayuda, especialmente cuando se está haciendo la generación de código para hacer controles vinculados automáticamente desde alguna fuente de datos.

2

La implementación de INotifyProperty modificada no es particularmente difícil, ya que solo tiene un miembro.

Si no espera cambios en el objeto subyacente, no se preocupe porque INotifyProperty haya cambiado y utilice un enlace con Mode=OneTime.

Si el objeto subyacente puede cambiar y desea que la GUI refleje esos cambios, ¿de qué otro modo se puede lograr sin el tipo de notificación que proporciona el cambio INotifyProperty? No es razonable esperar que un artículo encuadernado indague la fuente de su enlace.

Personalmente, he descubierto que WPF ha tardado un tiempo en familiarizarse, pero ahora que me estoy sintiendo cómodo me resulta increíblemente poderoso y agradable trabajar con él. Animo a cualquiera que encuentre WPF desafiante para seguir con eso.

0

Si está buscando una buena manera de pensar en estructurar su enlace de datos, intente establecer un DataContext en su árbol lógico solo una vez, luego use rutas de enlace para rellenar las diversas partes de su UI.

0

Sea tan declarativo como pueda en su encuadernación. Deje que el sistema de plantillas haga su trabajo y haga un uso intensivo de DataTemplate s que especifique DataType s explícita.

1

Enlazar en XAML es bastante fácil, sin embargo, el enlace dinámico de datos WPF en el código es doloroso y confuso.

+0

¡Entonces NO soy yo, después de todo! –

Cuestiones relacionadas