我有自定义向导控件,用于不同的项目。
作为一个项目中使用的示例page4,另一个项目仅使用第1页和第2页。
有没有办法让viewModel提供控件类型或类似的东西,以使contentcontrol
使用通用页面并显示正确的控件?
为了说清楚,我不想要与不同项目相关的硬编码控件,而是决定动态显示控件。
...
<ContentControl Grid.Row="1" Grid.Column="1" Content="{Binding CurrentPage}">
<ContentControl.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type viewModelControls:WizardPage1ViewModel}">
<viewModelControls:WizardPage1Control/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModelControls:WizardPage2ViewModel}">
<viewModelControls:WizardPage2Control/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModelControls:WizardPage3ViewModel}">
<viewModelControls:WizardPage3Control/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModelControls:WizardPage4ViewModel}">
<viewModelControls:WizardPage4Control/>
</DataTemplate>
...
</ResourceDictionary>
</ContentControl.Resources>
</ContentControl>
...
答案 0 :(得分:0)
如果我理解你正确的方法,你想要一个窗口, 在处于特定状态时托管不同的控件?
因此,例如,如果按下按钮Login,您想切换到另一个带有其他控件的窗口吗?
我会像你一样为控件创建DataTemplates:
<Window.Resources>
<DataTemplate x:Key="ShowLoginView">
<local:LoginView />
</DataTemplate>
<DataTemplate x:Key="ShowEditView">
<local:EditView />
</DataTemplate>
</Window.Resources>
并为contentcontrol设置触发器:
<Style x:Key="ContentControlStyle" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static Application.Current}, Path=SessionState}" Value="0">
<Setter Property="ContentTemplate" Value="{StaticResource ShowLoginView}"/>
</DataTrigger/>
<DataTrigger Binding="{Binding Source={x:Static Application.Current}, Path=SessionState}" Value="1">
<Setter Property="ContentTemplate" Value="{StaticResource ShowEditView}"/>
<DataTrigger>
</Style.Triggers>
</Style>
然后只需将样式添加到contentcontrol:
SessionState必须是共享资源(在App.xaml中)。 现在,您只需调用:
即可更改Window / UserControlif(Application.Current != null && Application.Current is App)
{
(Application.Current as App).SessionState = 0; // Login-Control
//or
(Application.Current as App).SessionState = 1; // Edit-Control
}
注意强>: 不要忘记将NotifyPropertyChanged添加到SessionState,否则绑定将不起作用。