Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Silverlight构造函数注入视图模型&x2B;设计模式_C#_Silverlight_Silverlight 4.0_Ioc Container_Mvvm Light - Fatal编程技术网

C# Silverlight构造函数注入视图模型&x2B;设计模式

C# Silverlight构造函数注入视图模型&x2B;设计模式,c#,silverlight,silverlight-4.0,ioc-container,mvvm-light,C#,Silverlight,Silverlight 4.0,Ioc Container,Mvvm Light,我正在努力用Silverlight4编写可测试的视图模型。Im目前正在使用MVVM灯光 我用的是AutoFac,IoCContainer做得很好。但是,要注入绑定到视图的ViewModels的构造函数,我有以下构造函数链接: public UserViewModel() : this(IoCContainer.Resolve<IUserServiceAsync>()) { } public UserViewModel(IUserServiceAsy

我正在努力用Silverlight4编写可测试的视图模型。Im目前正在使用MVVM灯光

我用的是AutoFac,IoCContainer做得很好。但是,要注入绑定到视图的ViewModels的构造函数,我有以下构造函数链接:

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

    }

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

        _userService = userService;
    }
public UserViewModel():这个(IoCContainer.Resolve())
{
}
公共用户视图模型(IUserServiceAsync用户服务)
{
如果(此.IsInDesignMode)返回;
_userService=userService;
}
虽然感觉不干净,但这是迄今为止我找到的最好的选择。这可以正常工作,我的应用程序也可以正常工作,并且可以通过控制反转进行测试

但是,当我的VM绑定到我的视图时,如下所示:

 <UserControl.DataContext>
            <ViewModel:UserViewModel />
 </UserControl.DataContext>
public class ViewModelLocator
{

    IoCContainer Container { get; set; }

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

}

在我的XAML页面属性中,VS2010和Blend中的设计模式都不起作用

有没有更好的方法来实现我在Silverlight中尝试的,仍然可以与设计模式一起工作的东西?失去设计模式并不是一个破坏者,但在学习XAML时会很方便。不过,一条干净的无锁链的路会很好

我想也许可以使用AutoFac/IoC将视图模型解析为视图,就像上面的XAML标记方法一样,并沿着这条路线走下去


谢谢。

我建议您实现ViewModelLocator,而不是实现第一个构造函数,如下所示:

 <UserControl.DataContext>
            <ViewModel:UserViewModel />
 </UserControl.DataContext>
public class ViewModelLocator
{

    IoCContainer Container { get; set; }

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

}
然后在XAML中,您可以干净地使用资源:

<UserControl
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->
在XAML中适当地声明它:

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

最后,在用户控件中使用它:

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

您可以使您的模拟视图模型定位器返回安全且易于读取的数据,以便混合使用,并且在运行时您将使用真正的服务

这样,您就不会丢失设计时数据,也不必牺牲视图模型中依赖项注入方法的清洁度


我希望这能有所帮助。

谢谢您的详细回复!
<UserControl
    d:DataContext="{Binding Path=UserViewModel, Source={StaticResource MockViewModelLocator}}"
    DataContext="{Binding Path=UserViewModel, Source={StaticResource ViewModelLocator}}"
    />
    <!-- The other user control properties -->