Pregunta

necesito un BindingList en mi interfaz de usuario para proporcionar el enlace de datos bidireccional entre mi colección y un DataGridView. Sin embargo, no parece correcto para devolver un BindingList de su capa de negocio (o capa de dominio, capa de servicio, la capa de datos, etc.). Es decir, que sólo estaría utilizando un BindingList debido a un requisito de interfaz de usuario, y ahora esta necesidad interfaz de usuario se acoplaría con mi capa de dominio.

¿Cuál es la manera "correcta" desacoplado de hacer esto? ¿Debo devolver un IList y luego copiarlo en un BindingList para fines de presentación? Desde una perspectiva del mundo real, esta es la pena por encima algo?

¿Fue útil?

Solución

Creo que la capa de dominio devolvería los tipos más genéricas y si se notificante (ObservableCollection<>) o no (IEnumerable<> o IList<>) depende de los requisitos.

La capa de interfaz de usuario puede hacer frente a tranforming como deseen (o no) en IBindingList si necesitan esa funcionalidad.

Hemos usado BindableLinq con gran éxito para alcanzar los objetivos de la notificación / lista de enlaces sincronizada (posiblemente con filtros ) en la capa de interfaz de usuario.

Otros consejos

No hay ninguna copia de un IList (al menos espero que realmente no desea crear una copia / clon). Todo lo que suele hacer es crear otra referencia sobre el mismo objeto IList. Así devolver un objeto IList es nada malo.

Usted puede devolver por ejemplo, un objeto de lista y se refieren a ella fuera de la BindingList (que se encuentra en la interfaz de usuario).

En mi opinión es mejor para devolver un objeto IList (Lista, aso HashTable) que una BindingList ya que puede utilizar la primera en diferentes interfaces de usuario (consola, Web, Win, Servicio). P.ej. utilizando un BindingList no sería de ninguna ventaja en una aplicación web.

No sé cuál es la forma "correcta" es, pero tengo marcos utilizados como CSLA en el pasado y sé que utiliza un BindingList y ahora un ObservableCollection para las listas de negocios. Esto hizo que el uso de los objetos de negocio en la interfaz de usuario muy simple como la interfaz de usuario se actualizará cuando se añaden o eliminan elementos de las listas. Si devuelve un IList y luego copiarlo en un BindingList que necesita para controlar manualmente y cambios mango a la IList y traducir los del BindingList. Mi preferencia personal es tener una capa de negocio característica rica cuando es posible que utilizaría un BindingList o ObservableCollection presentar la capa de negocio a la interfaz de usuario.

Si desea que los elementos de la interfaz de usuario para editar el modelo de negocio sin tener que implementar sus propios controladores de eventos, el modelo de negocio tiene que tener un BindingList.

Cada vez que haces algo como new BindingList<MyWidget>( list ) que son la disociación de la unión de la lista de raíz. Si se edita un elemento, todo va fino trabajo, pero las adiciones y supresiones no se reflejará en la lista original.

Hace poco intentó implementar algo como esto, aprovechando el evento ListChanged BindingList, que actualiza mi modelo para reflejar los cambios del BindingList, pero si el modelo fue cambiado por el controlador que no se actualizaba la BindingList en la interfaz de usuario.

Se podría producir descriptores de acceso especiales a las listas que los acontecimientos plantean cada vez que añada o artículos quitar de la lista, pero esto es sólo volver a inventar la rueda BindingList con más sobrecarga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top