WPF UI不从ViewModel / Caliburn.Micro更新

时间:2014-03-12 14:52:04

标签: c# wpf caliburn.micro

我有一个caliburn Micro应用程序,我在bootstrapper中加载了几个数据表。 我正在将其注入MEF,以便稍后在应用程序中使用。

我想向用户显示进度的启动画面。到目前为止,这一切都很好。 我正在使用EventAggregator让各个类将消息抛出到Splash Screen ViewModel,但UI线程似乎无法更新我的文本标签。我的属性设置正常,我正在调用NotifyOfPropertyChange,但是我的窗口似乎被冻结了,我的绑定属性上的get祖先没有被调用。

public string Message
    {
        get
        {
            return this.message;
        }
        set
        {
            this.message = value;
            //new System.Action(() => NotifyOfPropertyChange(() => Message)).BeginOnUIThread();
            //App.Current.Dispatcher.Invoke(() => NotifyOfPropertyChange("Message"));
            NotifyOfPropertyChange(() => Message);
        }
    }


    public void Handle(StartupNotification message)
    {
        Message = message.Message;
    }

Handle来自Caliburn.Micro IHandle EventAggregrator。数据被加载到引导程序中,我假设这个线程与UI线程是分开的,但我不会亲自创建任何线程。

在我的引导程序中,我按如下方式加载:

events.Publish(new StartupNotification("Loading Feeds..."));
batch.AddExportedValue<IFeedService>(new FeedService());

我试图通过间接措施触发UI,但由于某种原因我的主屏幕保持冻结状态。 任何人都可以表明我做错了吗?

最诚挚的问候, 马丁

2 个答案:

答案 0 :(得分:0)

引导程序在UI线程中运行,我假设你有这样的东西:

 protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
 {
     DisplayRootViewFor<ShellViewModel>();
     RunLongLoadingOperation();
 }

您应该执行类似

的操作
 protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
 {
     DisplayRootViewFor<ShellViewModel>();
     var task = Task.Factory.StartNew(RunLongLoadingOperation);

     // task error handling omitted, 
     // if your long operation can throw an exception you should 
     // add an oncompleted handler and do something with it or the
     // app will be brought down when the task gets GC'd
 }

答案 1 :(得分:-2)

现在已经解决了,我已将数据库加载移动到后台工作程序中,并在其中添加了Thread.Sleep,以便让UI有时间更新ProgressChanged事件。

我希望.NET能够解决这个问题,因为我已经将它移动到了后台工作者,但是很好。