mvvmlight galasoft c# wpf mvvm mvvm-light
El proyecto de muestra está aquí.

c# - galasoft - MVVM Light & WPF: vinculación de varias instancias de una ventana a un modelo de vista



nuget mvvmlight (2)

Estoy trabajando en mi primer proyecto en MVVM y he elegido usar MVVM Light Toolkit. Tengo un GameViewModel que maneja negocios en la pantalla principal de mi juego. Necesito averiguar cómo abrir una nueva ventana ( AdventurerView ) con una instancia de Adventurer como parámetro cuando se ejecuta un comando, vincularlo a AdventurerViewModel y mostrar y devolver datos. Las instancias de esta ventana se abrirán y cerrarán con frecuencia. He estado atrapado en esto por un par de días y me está volviendo loco. Me gustaría aprender cómo hacerlo de una manera MVVM amigable, preferiblemente con las herramientas proporcionadas por MVVM Light o XAML puro.

He intentado usar ViewModelLocator de MVVM Light, pero como AdventurerView es una ventana, no funcionará; dice "No se puede poner una ventana en un estilo", aunque el programa todavía se compila y se ejecuta. ¿Podría haber algo que pudiera cambiar para que funcione? ¿O hay otra forma de vincularlos en XAML? ¿O otro enfoque completamente? Realmente me encantaría poder salir de esto. También intenté usar el mensajero de MVVM Light sin éxito (que aún no aborda el problema View / ViewModel).

Solo necesito poder crear una ventana que esté vinculada a AdventurerViewModel y mostrar / devolver los datos apropiados.

AdventurerView.xaml está en su estado predeterminado en este momento, pero creo que si pudiera enlazar los datos apropiados que podrían ayudar (DataContext).

AdventurerViewModel es bastante escueto también

class AdventurerViewModel : ViewModelBase { #region Members private Adventurer _adv; #endregion #region Properties public Adventurer Adv { get { return _adv; } set { _adv = value; } } #endregion #region Construction public AdventurerViewModel(Adventurer adv) { this._adv = adv; } #endregion }

App.xaml con el DataTemplate que no funciona en la parte inferior:

<Application StartupUri="MainWindow.xaml" xmlns:views="clr-namespace:AoW.Views" xmlns:vm="clr-namespace:AoW.ViewModels" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="AoW.App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Application.Resources> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> <DataTemplate DataType="{x:Type vm:GameViewModel}"> <views:GameView /> </DataTemplate> <DataTemplate DataType="{x:Type vm:TitleViewModel}"> <views:TitleView /> </DataTemplate> <DataTemplate DataType="{x:Type vm:AdventurerViewModel}"> <views:AdventurerView /> </DataTemplate> </Application.Resources> </Application>

El comando en GameViewModel que, GameViewModel hará que todo esto suceda (el GameViewModel de GameViewModel simplemente confirma que el comando se está disparando):

private void ExecuteShowAdvCommand(Adventurer adv) { System.Windows.MessageBox.Show(adv.Name); }

Realmente no sé qué más incluir.


Ok, armé una demostración que debería hacer que esto sea más fácil para ti. Enlace de descarga

Funcionalidad

  • 3 Windows en Total ( ModalWindow , NonModalWindow ModalWindow , NonModalWindow ModalWindow NonModalWindow )
  • MainWindow tiene un TextBox , puede escribir lo que quiera.
  • 2 botones en la parte superior abrirán la Ventana Modal / NonModal en consecuencia
  • Cada ventana cuando se abre mostrará el mensaje que estaba en MainWindow''s TextBox en un TextBlock dentro de ellos.
  • En cada ventana, puede marcar una casilla de verificación para actualizar el valor en el bloque de texto del resultado en MainWindow (para la ventana modal, se activará cuando se cierre la ventana modal. Los cambios NonModal se pueden ver lo antes posible)

Eso es todo por la funcionalidad,

Conceptos:

  • Registrar varias SimpleIoC con SimpleIoC y usar GetInstance(...) para solicitarlas.
  • Uso de la clase Messenger con un tipo de mensaje personalizado OpenWindowMessage
  • Apertura de Windows modal / no modal de una máquina virtual principal que se mantiene fiel a los principios de MVVM
  • Pasar datos entre ventanas (solo se muestra en NonModal)

Nota importante: - El método utilizado en este ejemplo para configurar el DialogResult DP no desde la ventana modal no es compatible con MVVM, ya que usa el código subyacente para establecer la propiedad DialogResult en un evento Window.Closing que debe evitarse (si es necesario) "comprobable"). Mi enfoque preferido es un poco largo y está muy bien documentado AQUÍ (Mezcla de preguntas y respuestas). De ahí que lo haya ignorado por el bien de esta muestra.


Siga a Viv, modifiqué la muestra para incluir un ejemplo de apertura de la ventana sin usar un código detrás.

El proyecto de muestra está aquí.

Estoy utilizando el singleton ViewModelLocator con un método estático que actualiza el modelo de vista, la ventana y el contexto de datos en lugar del código subyacente.

Publicación del blog con detalles. Déjame saber qué método es preferible. No me gusta usar el código, pero podría haber pro y contra que me falta.