2017-02-13 13 views
0

Я пытаюсь сделать приложение WPF без использования prism.When я попытался получить мою viewmodel в представлении через mef путем impoting конструктор, он не работает. Также у меня есть инъекция свойств в моем коде, что также дает нулевую ссылку. Является ли это из-за не переопределения составного контейнера, если да, то как/где предоставить составной контейнер в приложении без призмы. Мой код как этот В XAML случае дизайн файла устанавливается в ViewModel и CS-файл, какMEF импорт и экспорт не работает

MainWindow.xaml.cs

public MainWindow() 
    { 
     InitializeComponent();    
    } 

    [ImportingConstructor] 
    public MainWindow(MainWindowViewModel viewModel) :this() 
    { 
     this.DataContext = viewModel; 
     this.ViewModel = viewModel; 
    } 
    public MainWindowViewModel ViewModel { get; set; } 

[Export] 
public class MainWindowViewModel 
{  
} 

точки останова в конструкторе MainWindow.xaml.cs не является удары на всех. Внутри viewmodel инъекции свойств также не бьют. Как решить эту проблему?

ответ

0

Вот пример использования PRISM 5, но он будет работать аналогично в PRISM 6.2.0.

Вам необходимо удалить стартовый uri из app.xaml. Затем убедитесь, что у вас установлен пакет PRISM.MEF NuGet. Напишите загрузчик, как показано ниже. (Обратите внимание, что Загрузчик базовый класс имеет целый ряд методов, чтобы переопределить с надлежащим местом для всей этой установки. Я застрял все это в одном методе для простоты.)

public class MyBootstrapper : MefBootstrapper 
{ 
    protected override DependencyObject CreateShell() 
    {    
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyBootstrapper).Assembly)); 
     var container = new CompositionContainer(catalog); 
     var shell = container.GetExport<MainWindow>().Value; 
     shell.Show(); 
     return shell; 
    } 
} 

Добавить атрибут Export к вашему MainWindow. Это будет необходимо для этой линии в загрузчике:

var shell = container.GetExport<MainWindow>().Value; 

[Export] 
public partial class MainWindow : Window{} 

Теперь все, что осталось, чтобы запустить загрузчик:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     var bootstrapper = new MyBootstrapper(); 
     bootstrapper.Run(); 
    } 
} 

Update

Вы можете получить довольно хорошую ручку на MEF, выполнив описанный здесь пример:

https://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx

Update

Вот уборщик способ реализации загрузчик.

public class MyBootstrapper : MefBootstrapper 
    { 
     protected override AggregateCatalog CreateAggregateCatalog() 
     { 
      return new AggregateCatalog(); 
     } 

     protected override void ConfigureAggregateCatalog() 
     { 
      AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MyBootstrapper).Assembly)); 
     }  

     protected override CompositionContainer CreateContainer() 
     { 
      return new CompositionContainer(AggregateCatalog); 
     } 

     protected override void ConfigureContainer() 
     { 
      base.ConfigureContainer(); 
     } 

     protected override DependencyObject CreateShell() 
     { 
      var shell = Container.GetExport<MainWindow>().Value; 
      shell.Show(); 
      return shell; 
     } 
    }