C#/WPF/Caliburn.Micro - Combobox ItemsTemplate 绑定到匿名类型 属性

C#/WPF/Caliburn.Micro - Combobox ItemsTemplate binding to anonymous type property

背景:我正在使用 C#、WPF 和 Calburn.Micro 创建一个 GUI-oriented 应用程序,其中 pre-defined 组多态性 objects 由 [=30= 实现] 继承自抽象 parent-class.

用户使用一个表单实例化不同的sub-classes,其中包含一个要实例化select的组合框class(组合框SelectedItem也计划触发更改表单内容根据 selected 类型的属性)。

我已经设法将所有继承 sub-classes 带入 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; }
    }

在运行时,我可以看到由空白项(以及调试器中的不同集合)填充的组合框,这让我觉得到目前为止还不错。

正如我之前所说,一些表单内容会根据Combobox的SelectedItem而改变,所以我认为正确的方向是让Combobox的项目成为类型,然后将不同的元素绑定到selected 类型的属性。 我正在尝试使用 ItemsTempalte 来实现它,从显示抽象 属性(称为 "ViewName")的 "subclass selector" 组合框开始,它被所有 subclasses:

        <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 代码 returns 每个子 class 的实例化对象可以放入 BindableCollection(而不是 BindableCollection)并且数据绑定工作正常。

在这里回答的人的支持:Get all inherited classes of an abstract class