Silverlight 4.0 在Silverlight 4中以设计模式访问模拟服务

Silverlight 4.0 在Silverlight 4中以设计模式访问模拟服务,silverlight-4.0,expression-blend,mvvm-light,Silverlight 4.0,Expression Blend,Mvvm Light,我的要求是 我使用的是MvvmLight,Viewmodel信息在设计时和运行时正确显示。然而,我想把它抽象成一个服务类。因此,我有我的模拟服务和真正的服务,它们都实现了IService 在app.xaml的codebehind中,我正在检查designtime,然后根据检查返回的内容在我的serviceloader上调用该方法 if (IsInDesignModeStatic) { ServiceLoader.LoadDesignTime

我的要求是

我使用的是MvvmLight,Viewmodel信息在设计时和运行时正确显示。然而,我想把它抽象成一个服务类。因此,我有我的模拟服务和真正的服务,它们都实现了IService

在app.xaml的codebehind中,我正在检查designtime,然后根据检查返回的内容在我的serviceloader上调用该方法

if (IsInDesignModeStatic)
            {
                ServiceLoader.LoadDesignTimeServices();
            }
            else
            {
                ServiceLoader.LoadRunTimeServices();

            }


public sealed class ServiceLoader
    {
        private ServiceLoader()
        {
        }

        public static void LoadDesignTimeServices()
        {
            ServiceContainer.Instance.AddService<IQuestionsService>(new dt.QuestionsService());
        }

        public static void LoadRunTimeServices()
        {

            ServiceContainer.Instance.AddService<IQuestionsService>(new rt.QuestionsService());

        }
    }
if(ISindesignatic)
{
ServiceLoader.LoadDesignTimeServices();
}
其他的
{
ServiceLoader.LoadRunTimeServices();
}
公共密封类服务加载器
{
私有ServiceLoader()
{
}
公共静态void LoadDesignTimeServices()
{
ServiceContainer.Instance.AddService(新的dt.QuestionsService());
}
公共静态void LoadRunTimeServices()
{
ServiceContainer.Instance.AddService(新的rt.QuestionsService());
}
}
这在运行时可以正常工作,但在设计时却不行。如果我在viewmodel中实际使用了designtime具体实现:

if (IsInDesignMode)
            {

                //var s = Infrastructure.GetService<IQuestionsService>();
                var s = new ReadmissionTrackingApplication.Client.Services.DesignTime.QuestionsService();

                QuestionCollectionView_Refresh(s.getQuestions());
            }
            else
            {
                //Listens for New Questionairre request. It receives the current ReadmitPatientResult
                Messenger.Default.Register<fnReadmitPatientList_Result>(this, ReceiveNewQuestionairreRequest);

                //TODO for testing only
                ReceiveNewQuestionairreRequest(null);

            }
if(IsInDesignMode)
{
//var s=Infrastructure.GetService();
var s=新的ReadmissionTrackingApplication.Client.Services.DesignTime.QuestionsService();
QuestionCollectionView_刷新(s.getQuestions());
}
其他的
{
//侦听新问题重新请求。它接收当前的ReadmitPatientResult
Messenger.Default.Register(此,ReceiveNewQuestionairreRequest);
//TODO仅用于测试
ReceiveNewQuestionairreRequest(空);
}

它以混合的形式出现。我需要做什么才能允许访问blend中的模拟服务?我想我记得读过一篇文章,我必须以某种方式将serviceloader添加到我的应用程序资源中,类似于使用viewmodels所做的操作……但我不知道具体需要如何操作,我假设它与vm的操作方式不同,因为我不是在视图中访问服务,而是从viewmodel访问服务。

问题是Blend并没有执行所有代码。要检查这一点,您可以附加一个调试器(从VisualStudio10到Blend 4,确保选择托管代码V4.0),并在安装代码中放置一个断点。可能没有人给它打电话

要解决此问题,可以尝试在ViewModelLocator中进行设置。由于VML是在App.xaml资源中创建的,Blend正在运行该代码。例如,您可以将设置代码放入静态VML构造函数中

干杯,
Laurent

我通过改变servicecontainer的工作方式使其工作。以前,当它只被调用一次时,不需要检查它是否已经运行,现在我让它在LoadDesigntime services上清除自己,如果collectioncount>0…然后我将serviceloader.LoadDesigntimeservices添加到实际viewmodel的ctor的设计时调用中。。我也停止调用dispatcherhelper.initialize。现在似乎是这样。