2011-05-20 72 views
1

即时通过我的webservice url传递给我的silverlight应用程序通过参数。Silverlight启动参数传递给viewmodel

当我的应用程序启动时,它会在触发application_startup事件之前为mainpage创建viewmodel。

在我的viewmodel构造函数我有一个调用我的serviceagent从web服务加载一些数据,但webservice url尚未初始化,因为在引发application_startup事件之前构造了viewmodel。什么是解决这个问题的最好方法。这是一个星期五的晚上,我的大脑似乎很想尝试想出一个好的解决方案。

的ViewModelLocator的一个实例在App.xaml中创建

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 

然后在ViewModelLocator构造有一个叫创建主页

public ViewModelLocator() 
    { 
     CreateMain(); 
    } 

    public static void CreateMain() 
    { 
     if (_main == null) _main = new MainViewModel(); 
    } 

,并在我的MainViewModel我做致电我的代理商

public MainViewModel() : this(new MyServiceAgent()) { } 

    public MainViewModel(IMyServiceAgent myServiceAgent) 
    { 
     if (IsInDesignMode) 
     { 

     } 
     else 
     { 

      ServiceAgent = myServiceAgent;   
      ServiceAgent.GetData(); 

      RegisterMessageListeners(); 
      WireUpCommands(); 
     } 
    } 

App.xaml.cs

public App() 
    { 
     Startup += Application_Startup; 
     Exit += Application_Exit; 
     UnhandledException += Application_UnhandledException; 

     InitializeComponent(); 
    } 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     if (e.InitParams != null && e.InitParams.Count > 0) 
      ParseInitParams(e.InitParams); 

     RootVisual = new MainPage(); 
     DispatcherHelper.Initialize(); 
    } 

Cheeers

+0

为什么你就不能移动的,其中的代码行viewmodellocator被初始化为application_startup?通常使用mvvmlight,这在application_startup上调用:DispatcherHelper.Initialize();此外,viewmodel定位器的工作原理是,一旦viewmodel属性第一次被调用,并且没有现成的属性,它将创建它,并且这只会在窗口初始化时调用。 – 2011-05-20 05:49:33

+0

您是否说过构造函数ViewModel在Application.Startup之前调用?我一直在试图重现这种情况,我的Startup总是在ViewModel初始化之前被调用(毕竟,在创建你要显示的视图的实例的Startup处理程序中)你能提供关于你的设置/场景? – Ando 2011-05-20 05:51:04

+0

它几乎是直接开箱的mvvm光工具包..我附上上面的代码.. – BBurke 2011-05-20 06:23:36

回答

1

来解决我的问题,我不得不删除从viewmodellocator构造函数代码被初始化的MainViewModel

public ViewModelLocator() 
{ 
    //CreateMain(); 
}