【问题标题】:Caliburn Micro - Excel add-in - threaded window - NotifyofPropertychangedCaliburn Micro - Excel 插件 - 线程窗口 - NotifyofPropertychanged
【发布时间】:2015-10-12 16:38:38
【问题描述】:

我是 Caliburn micro 的新手,正在尝试在 Excel 插件中使用它。我实际上是在使用 ExcelDna 来实现加载项。我有我的引导程序设置,并且能够在对话框中正确运行测试应用程序。一切都按预期工作。

然后我尝试在单独的线程中运行 Window/MainForm,因为出于各种原因我不希望它在 Excel 的主线程上运行。 NotifyOfPropertyChanged 仅针对 CanSayHello 引发以下错误:

{"向 UI 线程发送调用时发生错误"} {“调用线程无法访问此对象,因为另一个线程拥有它。”}

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

然后我尝试在新线程中初始化 boostrapper,这实际上使它工作。但是,如果我关闭 wpf 窗口并从我的 excel 菜单重新打开,我会收到一个错误,我无法初始化 boostrapper,因为“已经添加了具有相同键的项目”。

有什么建议吗?

弗兰克

代码:

    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());
    }        
}

【问题讨论】:

    标签: c# excel multithreading excel-dna caliburn


    【解决方案1】:

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

    static IWindowManager windowManager = new WindowManager();
    

    打电话

    IOC.Get<IWindowManager>();
    

    在您调用.Inizialize() 后获取窗口管理器,以便您获得正确的窗口管理器。

    这应该可以解决问题。

    从弗兰克到弗兰克....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-02
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多