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

时间:2015-12-22 09:47:49

标签: c# wpf

我有自定义向导控件,用于不同的项目。 作为一个项目中使用的示例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>
...

1 个答案:

答案 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 / 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,否则绑定将不起作用。