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