【问题标题】:Silverlight startup parameters pass to viewmodelSilverlight 启动参数传递给 viewmodel
【发布时间】: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 工具包..我在上面附上了代码..

标签: silverlight mvvm-light


【解决方案1】:

为了解决我的问题,我必须从初始化 MainViewModel 的 viewmodellocator 构造函数中删除这行代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多