MVVM Light :从视图中调用视图模型中的方法

本文关键字:视图 模型 方法 调用 Light MVVM | 更新日期: 2024-10-29 16:33:59

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

在我的视图中模型:

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

MVVM Light :从视图中调用视图模型中的方法

虽然我认为您的方案是沿途错误转弯的结果,但您可以使用服务定位器来解决您的问题:

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>();

如果该视图模型是视图的数据上下文,则可以按如下方式执行此操作:

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)); }
}