2011-03-31 11 views
5

Estoy trabajando con una aplicación WPF y utilizando mi propia arquitectura que se parece mucho a una M-V-VM/MVC. Tengo controladores para cada una de las vistas, y tengo ViewModels que están vinculados a las Vistas.¿Actualizar DataContext para vistas en WPF?

Por ejemplo, tengo una ToolBarView que tiene un ToolBarViewModel correspondiente, y un controlador ToolBar.

Estoy usando notificaciones para actualizar todas las vistas para que no necesiten hacerse referencia entre ellas, pero eso no es relevante para mi pregunta.

Cada una de las Vistas está esperando a que un evento se dispare en su controlador cuando el modelo se ha actualizado. En el ToolBarView esto se parece a lo siguiente.

/*In Constructor in ToolbarView*/ 
Controller.Updated += UpdateView 

/*Event Handler in ToolbarView*/ 
private void Updateview(object sender,EventArgs e) 
{ 
    DataContext = Controller.Model; 

    //Other Updating if needed 

} 

Si no es evidente, lo que el código está haciendo es decir que cuando el controlador activa el evento actualizado, para invocar la UpdateView (object sender, EventArgs e).

El problema que estoy experimentando es que la primera vez que se invoca UpdateView(), todo funciona bien, pero cuando se invoca por segunda vez, el DataContext parece estar aún vinculado al Controller.Model original .

Parece como si tuviera que liberar el DataContext o actualizarlo para que se vincule con el Modelo todo el tiempo.

El controlador está realizando operaciones en el modelo y, por lo tanto, cuando se invoca UpdateView(), debe mostrar los valores recientemente asignados en ese modelo.

¿Hay alguna manera de actualizar el DataContext, o hay alguna otra manera de hacerlo?

Respuesta

10

Si está asignando el DataContext a la misma instancia de su modelo, en realidad no "cambiará". WPF espera que los objetos lo notifiquen cuando cambia su estado, ya sea a través de las propiedades DependencyProperty o mediante la implementación de INotifyPropertyChanged.

Así que si haces algo como:

MyObject o = new MyObject(); 
o.MyString = "One"; 
this.DataContext = o; 
// ... some time later ... 
o.MyString = "Two"; 
this.DataContext = o; 

Suponiendo MiObjeto no implementa INotifyPropertyChanged, a continuación, la segunda asignación a DataContext es efectivamente inútil. Debería establecer DataContext en nulo, luego asignar su objeto nuevamente para que se "actualice".

Pero su mejor apuesta en general sería implementar INotifyPropertyChanged. Esto terminaría siendo mucho más eficiente, ya que solo la propiedad que realmente cambia debería actualizarse en la interfaz de usuario.

+0

De hecho estoy implementando INotifyPropertyChanged, pero en el caso de que lo esté usando, no ayudaría a actualizar el DataContext. Lo que haría es si el valor que estaba inicialmente vinculado a DataContext se modificó, lo mostraría, pero está en lo correcto en esa configuración que funcionó el DataContext para null. Desafortunadamente, WPF no ofrece una solución para "vaciar" o "actualizar" el DataContext como WinForms y .Net, así que eso tendrá que hacer. ¡Gracias! +1 por la idea – TheJediCowboy

Cuestiones relacionadas