ContentControl设置ViewModel中显示控件的类型
本文关键字:控件 类型 显示 设置 ViewModel ContentControl | 更新日期: 2023-09-27 18:27:39
我得到了在不同项目中使用的自定义向导控件。例如,一个项目中使用的第4页,而另一个项目仅使用第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>
...
如果我正确理解你,你想要一个Window,哪一个在特定状态下承载不同的控件?
例如,如果按下"登录"按钮,您想切换到另一个带有其他控件的窗口吗?
我会像你一样为控件制作数据模板:
<Window.Resources>
<DataTemplate x:Key="ShowLoginView">
<local:LoginView />
</DataTemplate>
<DataTemplate x:Key="ShowEditView">
<local:EditView />
</DataTemplate>
</Window.Resources>
并为内容控件设置触发器:
<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中)。现在,您只需调用即可更改窗口/UserControl
if(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,否则绑定将无法工作。