背景:我使用C#,WPF和Calburn.Micro创建与预先定义的一组由亚类从一个抽象父类继承来实现多态对象的面向GUI的应用程序。
用户使用实例化形式,其包含组合框来选择哪一个类实例不同的子类(组合框的SelectedItem也计划根据所选择的类型的属性,以改变触发的形式内容)。
我已经设法通过把所有继承的子类成BindableCollection:
private void LoadSubClasses()
{
Type _parentClass = typeof(ParentClass);
Assembly assembly = Assembly.GetExecutingAssembly();
Type[] _types = assembly.GetTypes();
IEnumerable<Type> SubClassesIEnumerable = _types.Where(t => t.IsSubclassOf(_parentClass));
foreach (var _subclass in SubClassesIEnumberable)
{
SubClassesColletion.Add(_subclass);
}
}
private BindableCollection<Type> _subClassesCollection = new BindableCollection<Type>();
public BindableCollection<Type> SubClassesCollection
{
get { return _subClassesCollection; }
set { _subClassesCollection = value; }
}
在运行时,我可以看到这点让我事情,到目前为止,一切顺利的空白项目(并在调试不同的集合)填充组合框。
正如我以前所述,一些形式的内容将根据组合框的的SelectedItem改变,因此我认为正确的方向是有ComboBox项是类型,然后结合的不同元素到所选择的类型的属性。我想,使用ItemsTempalte,开始被所有子类覆盖了“子类选择”组合框显示一个抽象的财产(称为“视图名”)来实现:
<ComboBox x:Name="SubClassesCollection" Height="23" Margin="5,0,5,0">
<ComboBox.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Path=ViewName}" Margin="-5"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
但我担心这是据我可以走了,一样仰视不同的解决方案并没有得到我的任何地方。
我的问题就解决了。我把它回溯到填充IEnumerable和改变了它完全的LoadSubClasses方法:
public void LoadSubClasses()
{
IEnumerable<ParentClass> subClassesIEnumerable = typeof(ParentClass)
.Assembly.GetTypes()
.Where(t => t.IsSubclassOf(typeof(ParentClass)))
.Select(t => (ParentClass)Activator.CreateInstance(t));
foreach (ParentClass _subClass in subClassesIEnumerable)
{
_subClassesCollection.Add(_subClass);
}
}
private BindableCollection<ParentClass> _subClassesCollection = new BindableCollection<ParentClass>();
public BindableCollection<ParentClass> SubClassesCollection
{
get { return _subClassesCollection; }
set { _subClassesCollection = value; NotifyOfPropertyChange(() => SubClassesCollection); }
}
纠正我,如果我错了,但我相信我的第一次尝试返回system.runtimetypes哪个是行不通的我了IEnumerable。新的LINQ代码返回一个实例化对象可以放入BindableCollection(而不是BindableCollection)每个子类和数据绑定工作正常。
道具谁在这里回答了这个问题的家伙:Get all inherited classes of an abstract class