我在第一个(MainView)中有2个视图我选择一个文件并导入它,在第二个视图(BView)中显示数据网格中该文件的详细信息。
这是第一个视图(MainView):
这是第二个视图(BView):
当我点击"导入"出现在进度条和文本上,而第二个视图加载。我想在另一个TASK中打开另一个视图,但是我收到此错误消息:
"调用线程无法访问此对象,因为其他线程拥有该对象。"
这是MainViewModel的代码:
[Export(typeof(IShell))]
public class MainViewModel : Screen
{
public string Path{ get; set; }
public bool IsBusy { get; set; }
public string Text { get; set; }
[Import]
IWindowManager WindowManager { get; set; }
public MainViewModel()
{
IsBusy = false;
Text = "";
}
public void Open()
{
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "Text|*.txt|All|*.*";
fd.FilterIndex = 1;
fd.ShowDialog();
Path= fd.FileName;
NotifyOfPropertyChange("Path");
}
public void Import()
{
if (Percorso != null)
{
IsBusy = true;
Text = "Generate..";
NotifyOfPropertyChange("IsBusy");
NotifyOfPropertyChange("Text");
Task.Factory.StartNew(() => GoNew());
}
else
{
MessageBox.Show("Select file!", "Error",
MessageBoxButton.OK, MessageBoxImage.Error);
}
}
public void GoNew()
{
WindowManager.ShowWindow(new BViewModel(Path), null, null);
Execute.OnUIThread(() =>
{
IsBusy = false;
NotifyOfPropertyChange("IsBusy");
Text = "";
NotifyOfPropertyChange("Text");
});
}
}
我能做什么?
答案 0 :(得分:6)
您需要在UI线程上执行WindowManager.ShowWindow
,因为Task.Start()将位于不同的线程上。应始终将任何UI操作编组到UI线程,或者获得您提到的跨线程异常。
尝试:
public void GoNew()
{
Execute.OnUIThread(() =>
{
WindowManager.ShowWindow(new BViewModel(Path), null, null);
IsBusy = false;
NotifyOfPropertyChange("IsBusy");
Text = "";
NotifyOfPropertyChange("Text");
});
}
编辑:试试这个
public void GoNew()
{
var vm = new BViewModel(Path);
Execute.OnUIThread(() =>
{
WindowManager.ShowWindow(vm, null, null);
IsBusy = false;
NotifyOfPropertyChange("IsBusy");
Text = "";
NotifyOfPropertyChange("Text");
});
}