mvvm light:从视图调用视图模型中的方法
mvvm light : call method in viewmodel from view
实际上我正在开发通用应用程序,我想从视图调用视图模型中的方法来更新要显示的数据。
在我的视图模型中:
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 的信使?
虽然我的观点认为您的情况是沿途错误转弯的结果,但您可以使用服务定位器来解决您的问题:
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)); }
}
实际上我正在开发通用应用程序,我想从视图调用视图模型中的方法来更新要显示的数据。
在我的视图模型中:
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 的信使?
虽然我的观点认为您的情况是沿途错误转弯的结果,但您可以使用服务定位器来解决您的问题:
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)); }
}