Pregunta

Estoy empezando a cabo con MVVM, y estoy empezando a entender las cosas. Actualmente estoy experimentando con el marco de la cincha, aunque no estoy comprometido con él hasta el momento.
Estaba inyectar el ViewModels en las Vistas utilizando por tener una referencia al modelo de vista en el código subyacente de la vista, con la propiedad de que tiene una [Dependencia] en él, y en la incubadora se establece el DataContext a la vista derecha, utilizando la Unidad. truco, pensé.

Estoy tratando de que mi aplicación para trabajar como una sola ventana, con vistas inyectados (en oposición a múltiples ventanas y hacer frente a la apertura \ cerrarlos) He cambiado mis puntos de vista de Windows a UserControls, y añadido una a la ventana principal. Eso funcionó, pero el modelo de vista que nunca se inyectó, presumiblemente porque el XAML no utiliza Container.Resolve para crear la vista, como cuando creé la vista y ha añadido manualmente en el código subyacente Resolver usando, la [Dependencia] fue creado .

¿Cómo puedo configurar mi ventana, por lo que si añado una vista a través de XAML, o la vista se cambia como resultado de una acción de interfaz de usuario, etc., se hace a través de la Unidad, de modo que pueda trabajar su magia?

¿Fue útil?

Solución

La manera de resolver el problema es hacer que su ventana para tener un modelo de vista, así, con ViewModels de UserControls expone como propiedades en ella. Luego, en el XAML para una ventana que le basta con utilizar el mecanismo de unión se DataContexts de UserControl a las propiedades propias de su modelo de vista su principal. Y puesto que el modelo de vista principal se resuelve desde el recipiente Unidad tendría todos los demás ViewModel-s inyectada según sea necesario.

Otros consejos

Este problema se resuelve normalmente utilizando Regiones y el RegionManager. En el modelo de vista de la ventana principal, se crea un conjunto de regiones y se añade a la RegionManager. Entonces ViewModels se pueden resolver y se añaden a la colección Region.Views.

En XAML, la región es normalmente inyecta por tener la propiedad ItemsSource de un ItemsControl unido a la propiedad región de la ViewModel principal.

Por lo tanto, en la pantalla principal modelo de vista que tendría algo como esto:

    public class TestScreenViewModel
{
    public const string MainRegionKey = "TestScreenViewModel.MainRegion";

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager)
    {
        this.MainRegion = new Region();
        regionManager.Regions.Add(MainRegionKey, this.MainRegion);
    }

    public Region MainRegion { get; set; }
}

Esto se resuelve normalmente en su IModule

        #region IModule Members

    public void Initialize()
    {
        RegisterViewsAndServices();

        var vm = Container.Resolve<SelectorViewModel>();
        var mainScreen = Container.Resolve<TestScreenViewModel>();
        mainScreen.MainRegion.Add(vm);

        var mainView = ContentManager.AddContentView("Test harness", mainScreen);
    }

    #endregion

Y la representación de la plantilla de XAML buscando algo así como

    <DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}">
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto">
        <StackPanel>
            <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" />
        </StackPanel>
    </ScrollViewer>
</DataTemplate>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top