Caliburn Micro - надстройка для Excel - резьбовое окно - NotifyofPropertychanged

Я новичок в Caliburn micro и пытаюсь использовать его в надстройке Excel. Я на самом деле использую ExcelDna, чтобы реализовать надстройку. Я настроил загрузчик и могу правильно запустить тестовое приложение в диалоговом окне. Все работает как ожидалось.

Затем я попытался запустить Window/MainForm в отдельном потоке, так как не хочу, чтобы он выполнялся в главном потоке Excel по разным причинам. NotifyOfPropertyChanged выдает затем следующую ошибку только для CanSayHello:

{"Произошла ошибка при отправке вызова в поток пользовательского интерфейса"} {"Вызывающий поток не может получить доступ к этому объекту, так как он принадлежит другому потоку."}

NotifyOfPropertyChange (() => Name) работает правильно без каких-либо проблем.

Затем я попытался инициализировать загрузчик в новом потоке, и это фактически заставляет его работать. Однако, если я закрываю окно 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());
    }        
}

1 ответ

Во-первых, вам не нужна эта дополнительная нить.

static IWindowManager windowManager = new WindowManager();

вызов

IOC.Get<IWindowManager>();

чтобы получить менеджер окон после вашего .Inizialize() позвоните, чтобы вы получили правильный оконный менеджер.

Это должно делать свое дело.

от Фрэнка к Фрэнку....

Другие вопросы по тегам