10

Entiendo que IObservable & IObserver son implementaciones del patrón de observador y se pueden usar en circunstancias similares a los eventos .Net.IObservable <T> e INotifyPropertyChanged - existe una conexión

Me preguntaba si hay alguna relación con INotifyPropertyChanged?

Actualmente uso INotifyPropertyChanged para el enlace de datos en winforms & WPF y me preguntaba si podré usar IObservable en escenarios de enlace de datos de IU.

Saludos

AWC

Respuesta

3

A menos WinForms y fijaciones WPF también apoyan IObservable, no va a ayudar a mantener la interfaz de usuario actualizada con los cambios en el modelo. La razón por la que puede usar INotifyPropertyChanged es porque el código de enlaces en WinForms y WPF busca esta interfaz, y cuando se implementa usa su evento para mantener la UI actualizada.

+0

gracias pero no del todo útil, sé cómo funciona la interfaz con respecto a la vinculación – AwkwardCoder

+2

@AWC: por el contrario, su explicación responde a sus preguntas, especialmente la última. –

+0

veamos - Declaro que ya uso INotifyPropertyChanged, por lo tanto, voy a entender cómo funciona con Winforms \ WPF, quería saber sobre IObservable y si esto tiene algún patrón de uso en Winforms \ WPF que es el último pregunta. Entonces realmente no es útil ... – AwkwardCoder

5

Según lo que puedo deducir, no hay relación. Los observadores/eventos de .NET son dos formas de lograr el comportamiento del estilo Observer/Notification.

La respuesta de Microsoft ha sido construir sobre el patrón de eventos .NET, no desaprobarlo a favor de objetos Observer registrados manualmente.

Uno de mis mayores problemas con los eventos es la incapacidad de borrar la cadena de delegados bajo demanda, lo que conduce a bastantes escenarios de fuga de memoria administrada. Con este fin, Microsoft introdujo el concepto de eventos débiles, es decir, para abordar el problema de los cronogramas no coincidentes para Observables/Observadores.

Puede leer más sobre el patrón WeakEvent here.

Josh Smith ha publicado una implementación del WeakEventManager para INotifyPropertyChanged here. Esto proporciona una manera más segura (desde el punto de vista de la memoria) de conectar objetos que cambian propiedades y sus Observadores.

+0

El proyecto MVVM Foundation parece muerto, no hay actividad en 2.5 años – BlackICE

1

Si se refiere a IObserver/IObservable como se define por las extensiones Rx:

http://channel9.msdn.com/shows/Going+Deep/Kim-Hamilton-and-Wes-Dyer-Inside-NET-Rx-and-IObservableIObserver-in-the-BCL-VS-2010/

y:

http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

A continuación, sus manzanas y naranjas como.

INotifyPropertyChanged solo proporciona una conexión de evento común para el enlace de datos/etc para que los controles sepan cuándo actualizar sus valores encuadernados.

IObservable/IObserver es más como "consultar con secuencias de eventos", pero incluso esa es una descripción pobre.

Hmm ... bien, entonces ya sabes cómo puedes poner cosas en esta "bolsa" llamada colección, y luego consultar esa colección (manualmente o con una declaración LINQ) para extraer los valores, ¿verdad? Es algo así como eso, pero en lugar de "sacar" datos de una "bolsa", te están haciendo llegar eventos "empujados".

Enchufe desvergonzado que podrían ayudar o más confunden: http://blog.lab49.com/archives/3252

2

En primer lugar, soy un poco nuevo Rx, a fin de tomar mis comentarios en consecuencia.

Dicho esto, creo que hay una gran oportunidad para la cooperación entre INotifyPropertyChanged y IObservable de Rx. Creo que es relativamente obvio que la interfaz de usuario se basa en INPC en este momento. Sin embargo, INPC también es una forma primaria de detectar cambios y administrar escenarios donde un modelo de dominio o modelo de vista tiene interdependencias entre objetos y propiedades. Son estas interdependencias las que parecen ser buenos candidatos para Rx.

Trabajar con INPC directamente es un poco complicado y algo doloroso. Muchas cuerdas mágicas para tratar. También es un poco doloroso observar un evento en un objeto a múltiples niveles en el árbol de objetos.

Pero si puedo modelar estas interacciones "de forma reactiva", entonces mis modelos de vista y de dominio comienzan a sentirse un poco más elegantes. Esto es evidente en la elegancia de proyectos como Bindable Linq, Continuous Linq, Obtics, etc. Estas bibliotecas simplifican la creación de "valores en vivo" o "colecciones en vivo" que se actualizan automáticamente (me atrevo a decir "reactivamente") a los cambios. Continuous Linq incluso tiene un "reactive object" framework para hacer una programación reactiva, aunque sin Rx.

Me parece que las sinergias entran si podemos usar Rx para mantener el modelo y ver el modelo coherente. Luego podemos hacer que la "superficie enlazable" del modelo/modelo de vista respete el INPC al continuar levantando PropertyChanged según sea necesario. He visto un par de elegant extension methods que creará un elemento observable desde INotifyPropertyChanged. Parece que la otra mitad de esto podría ser crear alguna infraestructura que traduzca de Rx a INPC.

+0

+1 Esto es exactamente lo que intento ver. También investigando [ReactiveUI] (http://www.reactiveui.net/) – Benjol

Cuestiones relacionadas