2011-02-08 20 views
5

Tengo una pregunta de varias partes:Detectando DataContext cambiado en Silverlight

(1) ¿Hay una buena razón por la que Silverlight no expone un evento DataContextChanged? Parece que se podrían evitar muchos problemas si alguien en Microsoft simplemente cambiara internal a public en la clase FrameworkElement (como lo hace WPF).

(2) He encontrado one o two diferentes métodos para hackear su camino en un evento DataContextChanged usando DependencyProperties en una configuración u otra. Pero no puedo hacer que funcionen de manera confiable. Mi prueba hasta ahora parece mostrar que disparan el evento DataContextChanged pirateado muy bien para la primera clase a la que los conecto, pero no disparan para ninguna otra clase. ¿Alguien más se ha encontrado con ese problema? O mejor aún, ¿se han abierto camino a su alrededor?

(3) La razón por la que me he dado a querer saber cuándo ha cambiado mi DataContext es que hay algunas operaciones de IU que son complicadas de hacer en XAML, pero son triviales en el código subyacente; y para muchas de esas cosas, necesito manejar eventos planteados por mi ViewModel; y por lo tanto, necesito saber cuándo mi ViewModel ha cambiado, así que puedo conectar los manejadores de eventos. ¿Es esta una vista precisa del mundo? ¿O es el hecho de que estoy tratando con este tipo de cosas en código subyacente, una indicación bastante buena de que mi pensamiento se ha descarrilado hace algunos años? No soy un purista de MVVM: solo quiero llegar rápidamente a un buen código y no me importa cómo llegue allí. Code-behind me ha servido razonablemente bien durante más de una década, y estoy dispuesto a abandonarlo por completo. ¿Pero es mi pragmatismo lo que me hace más difícil en este punto?

+0

Te escucho codificar por detrás que te ha servido bien durante más de una década. –

+2

Por lo que vale, se supone que este evento estará expuesto en Silverlight 5 (http://www.dotblogs.com.tw/kan/archive/2011/01/28/21097.aspx), aunque estoy seguro de que esto es una pequeña comodidad ahora. – RobSiklos

+0

Bueno saber. Me había perdido eso. –

Respuesta

2

"Pero es mi pragmatismo haciendo más difícil en mí mismo en este momento?"

Yo no lo llamaría pragmatismo. Yo lo llamaría miedo al cambio; permanecer en tu zona de confort En realidad, la vida es mucho más fácil si abandonas tu antigua forma de pensar y aceptas lo nuevo (y sé exactamente lo que quieres decir: yo estaba en el mismo barco que tú con código subyacente).

Ahora, fuera de mi caja de jabón y una respuesta más práctica:

Cuando se desea detectar cambios en su modelo, a continuación, conectar a los eventos que le permiten detectar cambios en su modelo . El DataContext no es realmente el modelo ... Todos sus objetos de modelo van a tener una implementación de INotifyPropertyChanged. Deberías engancharte a eso para un modelo dado, o conectarte a algo similar para un ObservableCollection.

Silverlight/WPF hacen todo este tipo de cosas MÁS fácil ahora que el enlace de datos realmente funciona.

No pelee con la estructura. No traigas viejas prácticas de ASP.Net contigo a este juego ... No te ayudará. Perderá las mejores partes del poder del marco de esa manera.

Saludos.

+0

Eso es más o menos lo que estaba tratando de hacer: hay algunos eventos PropertyChanged y CollectionChanged en mi ViewModel que quería que mi formulario respondiera, y que, por diversas razones, son difíciles de manejar en XAML directo (como el enlace a un RichTextBox). Pero necesitaba saber qué adjuntar a mis controladores de eventos, y esperaba hacerlo detectando cuándo había cambiado el DataContext. Lo que he hecho por ahora es recurrir a un método Initialize() por separado. No es tan limpio como me gustaría, pero funciona. Sin embargo, aprecia tus ideas sobre cómo aprender a hacer MVVM limpiamente. –

+0

Creo que un método Initialize() es totalmente apropiado Ken. Eso es lo que hago, básicamente. Cuando se carga una página, llamo a algo como _viewModel.Initialize() y allí hago las cosas iniciales que necesito hacer: carga inicial de los datos contextuales, rellenando listas desplegables de formularios, etc. –

+0

Parece una tontería tener que configurar el DataContext manualmente (para manejar cosas de inicialización) cuando se puede establecer una vez vía XAML y luego se hereda. Supongo que es por eso que están agregando soporte para esto en SL5 :-). –

Cuestiones relacionadas