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>
...

ContentControl设置ViewModel中显示控件的类型

如果我正确理解你,你想要一个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,否则绑定将无法工作。