【发布时间】:2011-05-20 05:31:10
【问题描述】:
我通过参数将我的 web 服务 url 传递给我的 silverlight 应用程序。
当我的应用程序启动时,它会在触发 application_startup 事件之前为主页创建视图模型。
在我的 viewmodel 构造函数中,我调用了我的 serviceagent 以从 web 服务加载一些数据,但是 web 服务 url 尚未初始化,因为 viewmodel 是在引发 application_startup 事件之前构建的。解决这个问题的最佳方法是什么。这是一个星期五的晚上,我的大脑似乎很煎熬,试图想出一个好的解决方案。
在 app.xaml 中创建 ViewModelLocator 的一个实例
<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();
}
干杯
【问题讨论】:
-
为什么不能把初始化viewmodellocator的代码移到application_startup?通常使用 mvvmlight 这在 application_startup 上调用: DispatcherHelper.Initialize(); viewmodel 定位器的工作原理是,一旦第一次调用 viewmodel 属性并且没有现有的属性,它将创建它,并且仅在初始化窗口时才会调用
-
你是说 ViewModel 的构造函数在 Application.Startup 之前被调用?我一直在尝试重现这种情况,并且我的 Startup 总是在 ViewModel 初始化之前被调用(毕竟,在 Startup 处理程序中,您创建了要显示的视图的实例)您能否提供有关您的设置的更多详细信息/场景?
-
它几乎是直接开箱即用的 mvvm light 工具包..我在上面附上了代码..