【问题标题】:mvvm light : call method in viewmodel from viewmvvm light:从视图调用视图模型中的方法
【发布时间】:2015-03-06 23:29:16
【问题描述】:

我实际上正在开发通用应用程序,我想从视图中调用视图模型中的一个方法来更新要显示的数据。

在我的视图模型中:

public async void GetDateScore(DateTime dt)
{
    string date = dt.Date.ToString("yyyyMMdd");
    List<Score> scoreList = await HtmlGetterHelper.GetLastNightScore(date);
    LastScore = new ObservableCollection<Score>();

    for (int i = 0; i < scoreList.Count; i++)
    {
        LastScore.Add(scoreList[i]);
    }
}

我尝试使用base.GetDataScore(DateTime.Today) 调用它,但它不起作用。 我不知道是否可以用这样的方法调用该方法,或者我是否应该使用 MVVM 的信使?

【问题讨论】:

    标签: c# windows-phone-8 mvvm mvvm-light win-universal-app


    【解决方案1】:

    虽然这是我的意见,但您的情况是沿途错误转弯的结果,您可以使用服务定位器来解决您的问题:

    var vm = ServiceLocator.Current.GetInstance<TypeOfObject>();
    // do something with viewmodel
    

    这是可能的,因为 MVVM Light 在添加 ViewModelLocator 文件时会这样做ServiceLocator.SetLocatorProvider(() =&gt; SimpleIoc.Default);

    对于MVVM Light,你可以使用(应该和上面一样):

    var vm = SimpleIoc.Default.GetInstance<SomeViewModel>();
    // do something with viewmodel
    

    当然要先注册:

    SimpleIoc.Default.Register<SomeViewModel>();
    

    【讨论】:

    • 好的,我想我可以用这个做点什么,但我只是想知道是否有可能做得更好。需要明确的是,我有一个 html 解析器,它获取一个 url 并返回一个对象,当我点击日历上的不同日期时,全天数据(这是一个关于体育比分的应用程序)在特定页面上,如 example.com/yyyyMMdd,我想更新视图模型中的数据,您认为有更好的方法吗?感谢您的回答!
    • 如果你有 2 路绑定,你可以将日历日期绑定到你 ViewModel 中的一个属性,一个新的日期会在 ViewModel 中引发OnPropertyChanged 事件,所以你将能够执行必要的操作,然后更新绑定到AllDayData 的属性。
    • 好吧,我想我会试试这个方法!非常感谢!
    • 很高兴能提供任何帮助!
    【解决方案2】:

    如果该视图模型是视图的数据上下文,您可以这样做:

    await (DataContext as YourViewModel).GetDataScore(date);
    

    但我建议使用不带代码的命令:

    <interactivity:Interaction.Triggers>
                        <interactivity:EventTrigger EventName="Tap">
                            <interactivity:InvokeCommandAction Command="{Binding GetDataSourceCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=YourTextBox, Path=Text}" />
                        </interactivity:EventTrigger>
    <interactivity:Interaction.Triggers>
    

    在视图模型中:

    public RelayCommand<DateTime> GetDataSourceCommand
    {
        get { return _getDataSourceCommand ?? (_getDataSourceCommand = new RelayCommand<DateTime>(GetDataSource)); }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2023-03-17
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2014-01-18
      • 2010-10-25
      相关资源
      最近更新 更多