Pregunta

Estoy tratando de llegar a enfrentarse con la escritura de ViewModels comprobables en Silverlight 4. Im actualmente el uso de luz MVVM.

Im usando autofac y la IoCContainer está haciendo su trabajo fino. Sin embargo, para inyectar en el constructor de ViewModels, que están obligados a Vistas tengo este encadenamiento constructor:

    public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>())
    {

    }

    public UserViewModel(IUserServiceAsync userService) 
    {
        if (this.IsInDesignMode) return;

        _userService = userService;
    }

Lo que no se siente limpio, pero es la mejor opción que he encontrado hasta ahora. Estos trabajos y mis aplicación funciona como se desea, y es comprobable con un control invertido.

Sin embargo, con mi máquina virtual vinculado a mi vista como esta:

 <UserControl.DataContext>
            <ViewModel:UserViewModel />
 </UserControl.DataContext>

En mis atributos de página XAML, el modo de diseño, tanto en VS2010 y Blend no funciona.

es que hay manera más agradable para lograr lo que estoy tratando de Silverlight que todavía funciona con el modo de diseño? Perder el modo de diseño isnt motivo de ruptura, pero será útil mientras se aprende XAML. Un limpiador de ninguna manera encadenada estaría bien, aunque!

Im pensando que tal vez sea posible utilizar autofac / COI que ViewModels resolver los puntos de vista, como adosados ??a la criterio de incremento XAML anterior, e ir por este camino?

Gracias.

¿Fue útil?

Solución

En lugar de implementar el primer constructor, le sugiero que implementa un ViewModelLocator, como esto:

public class ViewModelLocator
{

    IoCContainer Container { get; set; }

    public IUserViewModel UserViewModel
    {
        get
        {
            return IoCContainer.Resolve<IUserViewModel>();
        }
    }

}

A continuación, en XAML que declarar el localizador como un recurso estático:

<local:ViewModelLocator x:Key="ViewModelLocator"/>

Mientras que usted hace funcionar su aplicación, es necesario proporcionar el localizador con la instancia del contenedor:

var viewModelLocator = Application.Current.Resources["ViewModelLocator"] as ViewModelLocator;
if(viewModelLocator == null) { // throw exception here }
viewModelLocator.Container = IoCContainer;

A continuación, en XAML puede utilizar el recurso limpiamente:

<UserControl
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->

En tiempo de diseño, se puede implementar un MockViewModelLocator:

public class MockViewModelLocator
{

    public IUserViewModel UserViewModel
    {
        get
        {
            return new MockUserViewModel();
        }
    }

}

Pronúnciate en XAML apropiadamente:

<local:MockViewModelLocator x:Key="MockViewModelLocator"/>

Y finalmente utilizarlo en el control de usuario:

<UserControl
    d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}"
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->

Usted puede hacer su simulacro de vista del modelo de retorno de localización segura y de fácil lectura de datos de mezcla que debe utilizarse y durante el tiempo de ejecución se va a utilizar el servicio real.

Esta forma de hacer los datos en tiempo de diseño no perder y usted no tiene que sacrificar la limpieza de la metodología de inyección de dependencia en sus modelos de vista.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top