mvvm light: вызов метода в 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 ответа

Решение

Хотя, по моему мнению, ваш сценарий является следствием неправильного поворота, вы можете использовать сервисный локатор для решения вашей проблемы:

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

Это возможно, потому что MVVM Light делает это ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); когда он добавляет файл ViewModelLocator.

для 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>

и в viewmodel:

public RelayCommand<DateTime> GetDataSourceCommand
{
    get { return _getDataSourceCommand ?? (_getDataSourceCommand = new RelayCommand<DateTime>(GetDataSource)); }
}
Другие вопросы по тегам