Caliburn Micro - Excel插件线程窗口-通知属性更改

本文关键字:通知 属性 窗口 线程 Micro Excel 插件 Caliburn | 更新日期: 2023-09-27 18:17:31

我是新来的Caliburn micro,我试图在Excel插件中使用它。我实际上是用ExcelDna来实现插件的。我有我的引导程序设置,并能够在对话框中正确运行测试应用程序。一切都像预期的那样。

然后我尝试在一个单独的线程中运行Window/MainForm,因为我不想让它在Excel的主线程上运行,原因多种多样。NotifyOfPropertyChanged只对CanSayHello抛出以下错误:

{"向UI线程调度调用时发生错误"}{"调用线程无法访问此对象,因为它属于另一个线程。"}

NotifyOfPropertyChange(() => Name)工作正常,无任何问题。

然后我尝试在新线程中初始化boostrapper,这实际上使它工作。然而,如果我关闭wpf窗口并从我的excel菜单重新打开,我得到一个错误,我不能初始化引导程序,因为"具有相同键的项目已经添加"。

有什么建议吗?

弗兰克

代码:

    using Caliburn.Micro;
    using ExcelDna.Integration;
    using ExcelDNACMTest.ViewModels;
    using System.Threading;
    public class myBootstrapper:BootstrapperBase
        {                
            public myBootstrapper() :base(false)
            {        
            }
         }
        public class ProgramStart : IExcelAddIn //(this is ExcelDNA)
            {
                static Thread threadProgramWindow;
                static readonly MainViewModel ViewModel = new MainViewModel();
                static IWindowManager windowManager = new WindowManager();
                public void AutoOpen() //ExcelDNA - runs at start of xll
                {
                    var BS = new myBootstrapper();
                        BS.Initialize();
                    var myThread = new Thread(() =>
                        {
                            windowManager.ShowDialog(new MainViewModel());
                        }
                    );
                    myThread.SetApartmentState(ApartmentState.STA);
                    myThread.Start();
                }    
                public void AutoClose()
                {
                   }  


    //ViewModels
     class NameViewModel : PropertyChangedBase
        {
            string name;
            public string Name
            {
                get { return name; }
                set
                {
                    name = value;
                    NotifyOfPropertyChange(() => Name);
                    NotifyOfPropertyChange(() => CanSayHello);    //error here            
                }
            }
            public bool CanSayHello
            {
                get { return !string.IsNullOrWhiteSpace(Name); }
            }
            public void SayHello()
            {
                MessageBox.Show(string.Format("Hello {0}!", Name));
            }
        }
public class MainViewModel : Conductor<object>
{
    public void ShowPageOne()
    {
        ActivateItem(new NameViewModel());
    }        
}

Caliburn Micro - Excel插件线程窗口-通知属性更改

首先你不需要额外的线程。

static IWindowManager windowManager = new WindowManager();
电话

IOC.Get<IWindowManager>();

在你的.Inizialize()调用后获得窗口管理器,所以你得到正确的窗口管理器。

应该可以。

from Frank to Frank....