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

时间:2014-10-31 14:07:00

标签: c# asynchronous mvvm windows-phone inotifypropertychanged

所以这是场景。我有一个按钮,我开始下载数据。当我的方法完成后,我想要通知所有的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();”

2 个答案:

答案 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
}

希望对你有帮助..