我认为这个东西应该可以直接使用:
<UserControl.Resources>
<DataTemplate DataType="">
<v:GenericQuestion/>
</DataTemplate>
<DataTemplate DataType="">
<tv:GeographyQuestion/>
</DataTemplate>
<DataTemplate DataType="">
<tv:BiologyQuestion/>
</DataTemplate>
</UserControl.Resources>
<ContentControl Content="">
编辑:
是的,这肯定可以起作用。下面是一个更完整的示例:
主视图模型
public class MainWindowViewModel : ViewModelBase
{
public ObservableCollection<QuestionViewModel> QuestionViewModels { get; set; }
public MainWindowViewModel()
{
QuestionViewModels = new ObservableCollection<QuestionViewModel>
{
new GenericQuestionViewModel(),
new GeographyQuestionViewModel(),
new BiologyQuestionViewModel()
};
}
}
问题视图模型
public abstract class QuestionViewModel : ViewModelBase
{
}
public class GenericQuestionViewModel : QuestionViewModel
{
}
public class GeographyQuestionViewModel : QuestionViewModel
{
}
public class BiologyQuestionViewModel : QuestionViewModel
{
}
用户控件问题
<UserControl x:Class="WpfApplication1.GenericQuestion" ...>
<Grid>
<TextBlock Text="Generic Question" />
</Grid>
</UserControl>
<UserControl x:Class="WpfApplication1.GeographyQuestion" ...>
<Grid>
<TextBlock Text="Geography Question" />
</Grid>
</UserControl>
<UserControl x:Class="WpfApplication1.BiologyQuestion" ...>
<Grid>
<TextBlock Text="Biology Question" />
</Grid>
</UserControl>
主窗口
<Window x:Class="WpfApplication1.MainWindow" ...
Title="MainWindow"
Height="900"
Width="525">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<DataTemplate DataType="">
<local:GenericQuestion />
</DataTemplate>
<DataTemplate DataType="">
<local:GeographyQuestion />
</DataTemplate>
<DataTemplate DataType="">
<local:BiologyQuestion />
</DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
更新
Kyle Tolle指出了一种设置ItemsControl.ItemTemplate
的简化方法。下面是修改后的代码:
<ItemsControl ItemsSource="{Binding QuestionViewModels}"
ItemTemplate="{Binding}" />