获取Messenger.default.Receive

时间:2017-08-27 00:15:21

标签: c# xaml uwp mvvm-light

我在UWP应用程序中使用MVVMLight,我有两个屏幕:在MainScreen我有一个按钮可以打开第二个屏幕,我还有另一个按钮可以从MainScreen发送一些数据到第二个屏幕。我正在使用

Messenger.Default.Send(someobject)

和类似的

Messenger.Default.Register<Some>(this, (action) => ReceiveMsg(action));

我必须单击主屏幕上的按钮并将数据发送到其他视图。 问题是数据没有在第二个屏幕上更新,并导致异常

  

应用程序调用了为不同线程编组的接口

我尝试了多种方式来更新用户界面,例如thisthis实际上我已经尝试了所有这些可能性,如下所示

 private async void ReceiveMsg(Some action)
    {
        try
        {
            //await Task.Factory.StartNew(() => {
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //});

            //SharingData.UpdateScore(action);
            //DispatcherHelper.Initialize();

            //await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal
            //     , () =>
            //     {
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //     });

            //await Dispatcher.DispatchAsync(() =>
            //{
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //},1000, Windows.UI.Core.CoreDispatcherPriority.Normal);

            //await Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            //{
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //});

            //var views= Windows.ApplicationModel.Core.CoreApplication.Views.ToList()[0];
            //await views.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => {
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //});


            var thiswindow = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher;

            await thiswindow.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
             {
                 team1 = action.Team1;
                 this.RaisePropertyChanged("Team1");

             });

            //DispatcherHelper.CheckBeginInvokeOnUI(
            //() =>
            //{
            //    T1 = action.T1;
            //    RaisePropertyChanged(() => T1);
            //});
            //DispatcherHelper.Reset();
            //DispatcherHelper.Initialize();

        }
        catch (Exception ex)
        {
            //DispatcherHelper.Reset();
            //Console
        }
    }

我已经逐一尝试了上述所有段,但没有任何效果,仍然会“为不同的线程编组”错误。

请告诉我我做错了什么? 该属性正在进行更新,例如T1 ='Some Value'但没有反映在UI上,而RaisePropertyChanged则反映了它。

1 个答案:

答案 0 :(得分:0)

  

我必须单击主屏幕上的按钮并将数据发送到其他视图。问题是数据没有在第二个屏幕上更新,并导致异常

     

该应用程序调用了一个为不同线程编组的接口。

Send的{​​{1}}和Receive操作将在同一个帖子中调用。当您点击Messenger中的按钮时,MainScreenCoreWindow.Dispatcher的调度程序。如果您使用此调度程序修改第二个屏幕的内容,它将抛出异常。

要解决此问题,您应该在第二个屏幕的主线程中调用MainScreen方法。

Send