c# - usar - pasar una lista del controlador a la vista mvc
¿Cómo llamar funciones en un modelo de vista principal desde otros modelos de vista? (1)
El método
delegate
utilizado en esto y la respuesta vinculada se puede utilizar en cualquier relación padre-hijo y en cualquier dirección. Eso incluye desde un modelo de vista hijo a un modelo de vista padre, un código deWindow
detrás del código detrás de unaWindow
secundaria, o incluso relaciones de datos puros sin ninguna interfaz de usuario involucrada. Puede encontrar más información sobre el uso de objetosdelegate
de la página Delegados (Guía de programación C #) en MSDN.
Acabo de responder una pregunta similar a esta hoy. Si echas un vistazo a los parámetros de Passing entre la publicación viewmodels , verás que la respuesta implica el uso de objetos delegate
. Simplemente puede reemplazar estos delegate
(de la respuesta) con su (s) método (es) y funcionará de la misma manera.
Por favor hazme saber si tienes preguntas.
ACTUALIZACIÓN >>>
Sí, lo siento, olvidé por completo que quería llamar a métodos en su lugar ... He estado trabajando en demasiados mensajes esta noche. Así que sigue usando el ejemplo de la otra publicación, simplemente llama a tu método en el controlador ParameterViewModel_OnParameterChange
:
public void ParameterViewModel_OnParameterChange(string parameter)
{
// Call your method here
}
Piense en el delegate
como su camino de regreso al modelo de vista padre ... es como crear un evento llamado ReadyForYouToCallMethodNow.
De hecho, ni siquiera necesita tener un parámetro de entrada. Podrías definir a tu delegate
así:
public delegate void ReadyForUpdate();
public ReadyForUpdate OnReadyForUpdate { get; set; }
Luego, en el modelo de vista padre (después de adjuntar el controlador como en el otro ejemplo):
public void ChildViewModel_OnReadyForUpdate()
{
// Call your method here
UpdateDisplay();
}
Como tiene varios modelos de vista infantil, puede definir el delegate
en otra clase a la que ambos tengan acceso. Avísame si tienes más preguntas.
ACTUALIZACIÓN 2 >>>
Después de leer tu último comentario nuevamente, he pensado en un método mucho más simple que podría lograr lo que quieres ... al menos, si te entiendo correctamente. Es posible Bind
directamente desde las vistas de su hijo a su modelo de vista padre. Por ejemplo, esto le permitiría Button.Command
una propiedad Button.Command
en una vista secundaria a una propiedad ICommand
en su modelo de vista padre:
En TreeViewView
:
<Button Content="Click Me" Command="{Binding DataContext.ParentCommand,
RelativeSource={RelativeSource AncestorType={x:Type MainWindow}}}" />
Por supuesto, esto supone que una instancia del modelo de vista padre en cuestión se establece como el DataContext
de MainWindow
.
Mi programa está compuesto por un TreeView
y dos contentPresenters
a nivel del suelo. MainWindow, TreeView
y cada contentPresenter
tienen sus propios viewModels.
Me gustaría llamar a una función en mainWindowViewModel
desde TreeViewViewModel
.
Necesito hacer esto porque mainWindowViewModel
controla lo que se muestra en contentPresenters
, y me gustaría actualizar manualmente la pantalla.
Supongo que haría algo como esto ...
TreeViewViewModel
:
public class TreeViewViewModel
{
//Do I need to declare the MainWindowVM?
public TreeViewViewModel() { ... }
private void function()
{
//Command that affects display
//Manually call function in MainWindowVM to refresh View
}
}
He intentado acceder al MainWindowVM
desde TreeViewViewModel
utilizando:
public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } }
Pero no tiene mucho sentido. porque el MWVM no es el DataContext
del TreeViewViewModel
.