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()
позвоните, чтобы вы получили правильный оконный менеджер.
Это должно делать свое дело.
от Фрэнка к Фрэнку....