所以这是场景。我有一个按钮,我开始下载数据。当我的方法完成后,我想要通知所有的viewModel,无需输入视图,并使用下载的数据正确填充其属性。如何实现这种无痛?
private ICommand loadDataCommand;
public MyViewModel()
{
this.loadDataCommand = new DelegateCommand(this.LoadDataAction);
}
public ICommand LoadDataCommand
{
get
{
return this.loadDataCommand;
}
}
private void LoadDataAction(object p)
{
this.MyViewModelDataSource.Clear();
foreach (MyT mt in GlobalThings.MyTypeCollection)
{
this.MyViewModelDataSource.Add(tt);
}
}
所以这是我的ViewModel和我想写的填充数据的命令,但是当我的下载方法结束时我无法调用它,因为我需要创建一个我的ViewModel的实例而我不想这样做。 。也许对viewModels有一些通知?
编辑: 我做了你的建议,结果如下:
视图模型
public MyViewModel()
{
Messenger.Default.Register<MyType>
(
this,
(action) => ReceiveMessage(action)
);
}
private void ReceiveMessage(MyType action)
{
this.MyViewModelDataSource.Clear();
foreach (MyT mt in GlobalDeclarations.MyTypeCollection)
{
this.MyViewModelDataSource.Add(tt);
}
}
最后添加下载方法的类:
Messenger.Default.Send<MyType>(GlobalDeclarations.MyTypeCollection);
}
但它告诉我:
该应用程序调用了一个为a编组的接口 不同的线程
在这一行:“this.MyViewModelDataSource.Clear();”
答案 0 :(得分:0)
我认为你可以等待你的方法并将其余的实现放在它下面。这样做将等待执行该语句,然后开始处理其余的实现。
答案 1 :(得分:0)
我刚读过: - because I need to make an instance of my ViewModel and I dont want to.. Maybe some kind of notification to the viewModels?
实际上如果您使用的是MVVM light toolkit
,那么您会看到有一个班级ViewModelLocator
负责向您提供viewmodel
个对象。因为它注册了您的viewmodel并始终为您提供Viewmodel的先前对象。这是基本的IOC container
。
因此,每当您尝试通过Viewmodellocator访问某些Viewmodel时: - ViewmodelLocator.MainViewmodel
然后它将始终返回您之前创建的Viewmodel Object。所以请稍微阅读一下。我认为你没有得到MVVM
的工作。
上述实施后: -
我认为有两种方法: -
1)您可以使用MVVM灯库的MessangerClass。
2)创建一个保存此下载数据的静态类。在所有视图模型中使用此静态类(在考虑您的需求后建议使用此类),因为您希望使用相同的数据更新所有视图模型。
信使的使用非常简单: - 您也可以通过信使发送数据。
发送: -
Messenger.Default.Send<YourDataObjectClass>( msg );
注册接收: -
Messenger.Default.Register<YourDataObjectClass>
(
this,
( action ) => ReceiveMessage( action )
);
private object ReceiveMessage( YourDataObjectClass action )
{
// do your update
}
希望对你有帮助..