我在UWP应用程序中使用MVVMLight,我有两个屏幕:在MainScreen
我有一个按钮可以打开第二个屏幕,我还有另一个按钮可以从MainScreen
发送一些数据到第二个屏幕。我正在使用
Messenger.Default.Send(someobject)
和类似的
Messenger.Default.Register<Some>(this, (action) => ReceiveMsg(action));
我必须单击主屏幕上的按钮并将数据发送到其他视图。 问题是数据没有在第二个屏幕上更新,并导致异常
应用程序调用了为不同线程编组的接口
我尝试了多种方式来更新用户界面,例如this,this实际上我已经尝试了所有这些可能性,如下所示
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则反映了它。
答案 0 :(得分:0)
我必须单击主屏幕上的按钮并将数据发送到其他视图。问题是数据没有在第二个屏幕上更新,并导致异常
该应用程序调用了一个为不同线程编组的接口。
Send
的{{1}}和Receive
操作将在同一个帖子中调用。当您点击Messenger
中的按钮时,MainScreen
是CoreWindow.Dispatcher
的调度程序。如果您使用此调度程序修改第二个屏幕的内容,它将抛出异常。
要解决此问题,您应该在第二个屏幕的主线程中调用MainScreen
方法。
Send