WPF中的DataTemplates

我对WPF中的数据模板有一般性问题。 假设我有一个名为“问题”的抽象类,以及各种子类,如“MathQuestion”,“GeographyQuestion”等。在某些情况下,使用“问题”数据模板将问题呈现为“问题”已经足够了,但是假设我有一个不同子类的随机问题对象列表,我想反过来显示它们。 我想使用他们的特定数据模板而不是他们的通用问题数据模板向用户显示它们,但由于我不知道在设计时,无论如何都告诉WPF,“嘿,这是一个Quesitons列表,但是使用reflection来确定他们的具体类型并使用那个数据模板?“

到目前为止我所想到的:我认为除了我的问题集之外,我可以使用reflection创建另一个特定类型的集合,并以某种方式将其绑定到“blah”,然后我会得到所需的效果,但是你只能绑定到WPF中的DependencyProperties,所以我不确定我绑定到什么。 我真的不喜欢这个想法,我的直觉告诉我有一个更优雅的方法来解决这个问题。

我不是在这里寻找具体的代码,只是一个完成我想要做的事情的一般策略。 另外,如果有帮助的话,我大部分时间都在使用MVVM。

谢谢

我认为这样的东西应该是开箱即用的:

            

编辑:

是的,这绝对应该有效。 这是一个更完整的例子:

主视图模型

 public class MainWindowViewModel : ViewModelBase { public ObservableCollection QuestionViewModels { get; set; } public MainWindowViewModel() { QuestionViewModels = new ObservableCollection { new GenericQuestionViewModel(), new GeographyQuestionViewModel(), new BiologyQuestionViewModel() }; } } 

问题查看模型

 public abstract class QuestionViewModel : ViewModelBase { } public class GenericQuestionViewModel : QuestionViewModel { } public class GeographyQuestionViewModel : QuestionViewModel { } public class BiologyQuestionViewModel : QuestionViewModel { } 

问题用户控制

                

主窗口

                        

更新

Kyle Tolle指出了一个很好的简化设置ItemsControl.ItemTemplate 。 以下是生成的代码:

  

通常,如果需要基于某些非静态逻辑动态更改DataTemplate,则需要使用DataTemplateSelector 。 另一种选择是在DataTemplate中使用DataTriggers来适当地修改外观。