데스크톱 응용 프로그램에 WPF/PRISM/MEF를 사용하고 있습니다.WPF, MEF, Prism - 셸에서 DataContext를 설정하는 방법
이것은 세 영역이있는 간단한 테스트 응용 프로그램입니다. 보기는 외부 모듈 에 정의되어 있습니다.
내 셸 DataContext를 설정해야합니다. 그래서 아래 그림처럼 과 같은 뷰 모델로 설정하면 애플리케이션이 제대로 작동합니다.
나는 명시 적 정의에 만족하지 않습니다. 일부 모듈을로드하고 초기화하는 동안 을 사용할 수 없으며 일부보기를 찾고 내 쉘의 DataContext 에 할당합니까? 설명서는 어디에서 찾을 수 있습니까? 개발자 안내서 (및 샘플 응용 프로그램)에이 설명서가 없으므로 입니다. 아니면 다른 사람이 제안을 했습니까?
Shell.xaml :
<Window x:Class="TestMenuTaskbarDT.Shell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://www.codeplex.com/prism"
xmlns:local_viewmodels="clr-namespace:TestMenuTaskbarModuleMain.ViewModels;assembly=TestMenuTaskbarModuleMain"
. . .
>
<Window.InputBindings>
<KeyBinding Key="S" Modifiers="Control" Command="{Binding Path=CloseProjectCommand}" />
<KeyBinding Key="O" Modifiers="Control" Command="{Binding Path=OpenProjectCommand}" />
</Window.InputBindings>
<StackPanel>
<ItemsControl Name="MainMenuRegion" prism:RegionManager.RegionName="MainMenuRegion" />
<ItemsControl Name="MainToolbarRegion" prism:RegionManager.RegionName="MainToolbarRegion" />
<ItemsControl Name="MainContentRegion" prism:RegionManager.RegionName="MainContentRegion" />
</StackPanel>
<!-- How does one set the datacontext, when it should be dynamically loaded? -->
<Window.DataContext>
<local_viewmodels:MainWindowViewModel />
</Window.DataContext>
</Window>
(또는 ... 자원에 넣어 어떻게 든이 설정 local_viewmodels해야합니까?)
나는 다음 부트 스트 래퍼에 다음과 같은 일을 할 수 있나요? 또는 다른 기술이 모두 있습니까?
Bootstrapper.cs :이 속성을 정의한 것 내 Shell.xaml.cs에서
. . .
class Bootstrapper : MefBootstrapper
{
. . .
protected override IModuleCatalog CreateModuleCatalog()
{
// All dlls are expected to reside in the same directory as the *.exe
return new DirectoryModuleCatalog() { ModulePath = System.AppDomain.CurrentDomain.BaseDirectory };
}
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
// Module registration remains the same *IT* registers the views with the region catalog
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(TestMenuTaskbarModuleMain.TestMenuTaskbarModuleMain).Assembly));
}
. . .
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.MainWindow = (Window)this.Shell;
// Is something like the following possible?
_MyBaseViewModel = GetAViewModelSomehowFromAModule("MyViewModelKey");
Application.Current.MainWindow.DataContext = _MyBaseViewModel;
//
Application.Current.MainWindow.Show(); // Displays MainWindow
}
(또는 local_viewmodels ... 리소스에 넣고 어떻게 든 설정해야합니까?) View Model Locator.AutoWireViewModel – adminSoftDK
멋진 팁 - 확장 필요 어휘. 검색 ViewModelLocator AutoWire는 Silverlight 또는 .net 4.5 또는 Prism 5.0에서 사용할 수있는 다양한 솔루션을 제공합니다. (그들은 CompositionIntializer/ExportFactory가 필요해 보입니다) 새로운 ViewLocator는 내가 원하는 것처럼 보입니다. 거의 모든 것을 XAML에서 가능하게 할 것입니다 - 현재 VS2010, .Net 4.0, Prism 4.1을 데스크톱에서만 사용하고 있습니다. 나는 구식의 것을 더 찾을 것이다. 그러나 여전히 팁을 사용할 수있다. – infowanna
쉘에서 의존성 주입으로 뷰 모델을 가져올 수도 있습니다. 예를 들어'[ImportingConstructor] public Shell (MyViewModel viewModel) {this.DataContext = viewModel; }' – dymanoid