我正在使用WPF
框架制作MVVM
计划,并为Ninject
制作Dependancy Injection
。我创建了两个项目,一个.Net Class Library
核心项目,用于其他.Net
应用程序和WPF
特定应用程序。
目前,我正在使用ApplicationViewModel
Property
CurrentPage
使用我的应用更改网页。 CurrentPage
是名为Enum
的{{1}}类型,其中包含我的应用程序中的不同页面。在我的WPF应用程序的MainWindow中,ApplicationPage
Content
到bound
的框架使用值转换器将值转换为我使用的CurrentPage Property
CustomPages
声明,如下:
switch
我想使用if (value is ApplicationPage)
switch ((ApplicationPage)value)
{
case ApplicationPage.PageOne:
return new PageOne();
case ApplicationPage.PageTwo:
return new PageTwo();
default:
throw Exception;
}
}
Constructor
将这些网页的Injection
传递到View Models
中的Page's
Constructor
,使用Converter
ViewModels
已成为Injected
类ApplicationViewModel
,有点像这样:
case ApplicationPage.PageOne:
return new PageOne(PageOneViewModel);
我的第一个想法是,是否有某种方法可以使CurrentPage
Property
实际上成为特定ViewModel
并执行switch
ViewModel
所以Converter
将ViewModel
转换为Page
?
然而CurrentPage
的类型是一个问题,因为它必须设置为ViewModels
之一,因此无法获取其他ViewModel
的值},让您只使用一个ViewModel
Class
来处理。
我的想法是:有没有办法将ViewModel
传递给Converter
?或者我可以将CurrentPage
设置为IViewModelFactory
并在工厂内的转换器中创建ViewModel
吗?在这种情况下,如何更改CurrentPage
的值以更改应用程序中的页面?
是否有办法在遵循此逻辑时坚持Dependency
Injection
,或者是否有另一种方式我是否需要重新考虑我的代码以进行页面更改?不幸的是,我见过的大多数例子都属于所谓的ServiceLocator
反模式。
答案 0 :(得分:0)
答案是使用如下数据模板,
<Window.Resources>
<DataTemplate x:Key="View1Template" DataType="{x:Type local:MainWindowViewModel}">
<!-- Custom control style with a Data Context set to a Viewmodel
object in the MainWindowViewModel -->
<local:CustomPage1 DataContext="{Binding CustomPage1ViewModel}" />
</DataTemplate>
<DataTemplate x:Key="View2Template" DataType="{x:Type local:MainWindowViewModel}">
<!-- Custom control style with a Data Context set to a Viewmodel
object in the MainWindowViewModel -->
<local:CustomPage2 DataContext="{Binding CustomPage2ViewModel}" />
</DataTemplate>
</Window.Resources>
然后在Data Trigger
;
Content Control Style
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<!-- The Default/initial View being shown -->
<Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
<!-- Triggers bound to the CurrentView Property -->
<Style.Triggers>
<DataTrigger Binding="{Binding CurrentView}" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource View1Template}" />
</DataTrigger>
<DataTrigger Binding="{Binding CurrentView}" Value="2">
<Setter Property="ContentTemplate" Value="{StaticResource View2Template}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
CurrentView
是一个属性,可以在代码中更改为Trigger
UI
中的更改 - 可以设置为Enum
PageNames