2017-01-02 2 views
2

Я пробовал это некоторое время, и у меня есть некоторые проблемы. У меня есть проект, который динамически загружает 1 или более DLL, и я не могу заставить привязку вида работать.Caliburn Micro - View & viewmodel в отдельной DLL

Я переопределен метод SelectAssemblies как таковой:

protected override IEnumerable<Assembly> SelectAssemblies() 
    { 
     string[] AppFolders = Directory.GetDirectories(Config.AppsFolder); 

     List<Assembly> assemblies = new List<Assembly>(); 
     assemblies.Add(Assembly.GetExecutingAssembly()); 

     foreach (string f in AppFolders) 
     { 
      Assembly ass = Directory.GetFiles(f, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).SingleOrDefault(); 
      if (ass != null) 
      { 
       assemblies.Add(ass); 
      } 
     } 
     Apps = assemblies; 
     return assemblies; 
    } 

Это работает, как задумано, я тогда есть метод, который работает на нажатие кнопки, которая делает:

public void OpenApp(string appName) 
    { 
     //AppName should be the same as the dll. 

     string assName = string.Format("TabletApp.{0}", appName); 

     Assembly ass = AppBootstrapper.Apps.SingleOrDefault(x => x.GetAssemblyName() == assName); 

     if (ass != null) 
     { 
      dynamic vm = ass.CreateInstance(string.Format("TabletApp.{0}.ViewModels.{0}ViewModel", appName)); 
      IoC.Get<IWindowManager>().ShowDialog(vm); 
     } 
    } 

Это находит viewmodel fine, однако я получаю сообщение об ошибке «не удалось найти контракт для« ExampleView »при загрузке ExampleViewModel. Мне также пришлось добавить [Export (typeof (view)] для каждого вида в базовой сборке, так как я внес это изменения. Похоже, что Caliburn micro автоматически прекратил инициализацию просмотров.

Кто-нибудь знает, вы сделали не так?

ответ

1

Так получилось, что я ничего не делал, По пути я обновил свой caliburn.micro до 3.0.2. Как оказалось, небольшое изменение, которое они сделали, стало серьезным обновлением. не пойдет в нее полностью здесь, кроме как указать на сво GetInstance в загрузчике, который должен быть изменен.

protected override object GetInstance(Type service, string key) 
    { 
     // Skip trying to instantiate views since MEF will throw an exception 
     if (typeof(UIElement).IsAssignableFrom(service)) 
      return null; 

     var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key; 
     var exports = container.GetExportedValues<object>(contract); 

     if (exports.Any()) 
      return exports.First(); 

     throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract)); 
    } 

Пожалуйста, ознакомьтесь со следующей лина k для получения более подробной информации.

https://github.com/Caliburn-Micro/Caliburn.Micro/pull/339

Смежные вопросы