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
背景:我正在使用 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