通知我的ViewModels异步事件已完成



下面是场景。我有一个开始下载数据的按钮。当我的方法完成后,我希望通知我的所有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的实例,而我不想。也许会向ViewModel发出某种通知?

编辑:我按照你的建议做了,结果如下:

ViewModel

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();"

我认为您可以在方法中等待,并将实现的其余部分放在它下面。这样做将等待要执行的语句,然后开始处理实现的剩余部分。

我刚刚读到:-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对象。因为它注册了您的视图模型,并始终为您提供视图模型的前一个对象。它基本上是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
}

希望它能帮助你。。

最新更新