首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caliburn Micro - Excel add-in threaded window - NotifyofPropertychanged

Caliburn Micro - Excel add-in threaded window - NotifyofPropertychanged
EN

Stack Overflow用户
提问于 2015-10-13 00:38:39
回答 1查看 291关注 0票数 0

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

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

{“将调用调度到UI线程时出错”}{“调用线程无法访问此对象,因为另一个线程拥有它。”}

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

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

有什么建议吗?

弗兰克

代码:

代码语言:javascript
复制
    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());
    }        
}
EN

回答 1

Stack Overflow用户

发布于 2016-06-16 17:31:05

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

代码语言:javascript
复制
static IWindowManager windowManager = new WindowManager();

打电话

代码语言:javascript
复制
IOC.Get<IWindowManager>();

.Inizialize()调用之后获取窗口管理器,这样您就可以获得正确的窗口管理器。

这应该能起到作用。

从弗兰克到弗兰克..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33086105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档