mvvm light:viewmodel中的call方法

时间:2015-03-06 23:29:17

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

我正在开发Universal app,我想从视图中调用viewmodel中的方法来更新要显示的数据。

在我的viewmodel中:

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的信使?

2 个答案:

答案 0 :(得分:0)

虽然这是我的意见,但是您的方案是错误转向的结果,您可以使用服务定位器来解决您的问题:

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

这是可能的,因为MVVM Light在添加ViewModelLocator文件时执行此操作ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

对于 MVVM Light 具体来说,你可以使用(应该与上面相同):

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

当然你必须先注册:

SimpleIoc.Default.Register<SomeViewModel>();

答案 1 :(得分:0)

如果viewmodel是视图的datacontext,你可以这样做:

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>

并在viewmodel中:

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