c# - español - mvvm wpf
¿Cómo puedo acceder a un control en el modelo mvvm en viewmodel? (5)
Debería mover su código de creación a Ver, y ViewModel debería simplemente notificar a la vista cuando debería ser llamado.
Tengo una ventana de WPF, y en esa ventana tengo una grilla.
Uso el modelo MV-VM y quiero agregar un TextBox a la grilla dinámicamente en el código (en el modelo de vista)
¿Cómo puedo acceder a la grilla?
Si está utilizando Caliburn Micro, implemente el siguiente paso:
Haga que ViewModel se herede de la interfaz
IViewAware
; Vas a implementar dos métodos AttachView y GetView de esta interfaz.Defina una variable con el tipo de vista para obtener la referencia a la vista
Ver detalle a continuación:
private SomeViewClass v; public void AttachView(object view, object context = null) { v = view as BomView; if (ViewAttached != null) ViewAttached(this, new ViewAttachedEventArgs() { Context = context, View = view }); } public object GetView(object context = null) { return v; }
Más tarde, puede acceder a un elemento único en la Vista a través de v, como v.txtName = "John"; etc ...
También puede usar el DataContext (que es el ViewModel) de la Vista en el código detrás de la vista, y agregar el cuadro de texto a la grilla allí. Eso tendría más sentido.
Si le da un nombre a la grilla en su archivo XAML, podrá acceder a la grilla en el código inmediatamente.
antes de ir a ViewMode, aparece tu código detrás y atrapa el control objetivo de esa manera
No abandone ViewModel en instancias xaml de eso use el controlador de eventos
Esto le proporciona una nueva capa que le permite construir su arquitectura de la siguiente manera: MVVM => MV (C) VM
Utilice el patrón de Controlador Supervisor .
Leyendo:
La implementación de ejemplo para el marco de CaliburnMicro MVVM se muestra aquí (funcionará igual para todos los demás frameworks, o puede hacerlo a mano si está haciendo MVVM por su cuenta):
http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view
Ejemplo:
1) Definir IView
interfaz en el que ViewModel
( VM
) hablará con View
con los métodos requeridos
public interface IView
{
void AddTextBoxToGrid();
}
2) Heredar código detrás de View
desde su IView
e implementar el método IView.AddTextboxToGrid()
public partial class View : IView
{
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
3) Agregue la propiedad de tipo IView
a su VM
public class ViewModel
{
public IView View { get; set; }
}
4) Establecer la propiedad View
en VM
a instancia de View
como IView
por ejemplo, en código detrás de DataContext.View = this como IView; o en Caliburn puede usar IScreen.OnViewAttached override method)
public partial class View : IView
{
public View()
{
// access you VM by strategy of your framework or choice - this example is when you store your VM in View''s DataContext
(DataContext as ViewModel).View = this as IView;
}
public void AddTextBoxToGrid()
{
// implement here your custom view logic using standard code behind;
}
}
5) En tu VM
llama a IView.AddTextboxToGrid()
public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}