2014-10-31 50 views
0

所以这里是场景。我有一个开始下载数据的按钮。当我的方法完成后,我希望我的所有viewModel都能得到通知,而无需输入视图,并可以使用下载的数据正确填充其属性。如何实现这个无痛人流?通知我的ViewModels异步事件已完成

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和我的一个实例不想要..也许某种通知到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); 
} 

但它告诉我:

应用程序调用这是整理了 不同的线程

在这条线的接口: “this.MyViewModelDataSource.Clear();”

回答

0

我想你可以在你的方法中等待,并将其余的实现放在它的下面。这样做将等待执行的语句,然后开始处理其余的实现。

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对象。所以只是读一点关于它。我认为你没有得到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 
} 

希望它能帮助你..

+0

所以我。发送()我的全球MyTypeCollection对象结束下载方法?但是这个注册的东西是在ViewModel的构造函数中完成的? – 2014-10-31 14:27:12

+0

是在构造函数中,请参阅编辑,将真正帮助你.. – loop 2014-10-31 14:28:03

+0

任何想法为什么在ReceiveMessage方法,当我尝试插入一些代码它告诉我: “类型'System.Runtime.InteropServices的异常。 COMException'发生在mscorlib.ni.dll中,但未在用户代码中处理 附加信息:应用程序调用了针对不同线程进行编组的接口(即从HRESULT异常:0x8001010E(RPC_E_WRONG_THREAD))“ 即使当我把它放在 Application.Current.Resources.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=> ...); – 2014-11-03 09:30:48