如何解决WPF将Datagrid绑定到不同类型的ObservableCollection列表
这可能可以从不同的角度来解决,但我现在有点困惑。
我想要一个Datagrid,它可以将不同类型的数据添加到后端的列表中。 我有一个ObservableCollections列表,所有这些元素中都有不同类型的元素(我使用的是MVVM,我有几个不同的模型类)。在我的前端,我有一个DataGrid,它应该根据组合框中选择的值来显示列表的数据。它也必须动态发生,并且不能使用固定的网格,因为事物会不断添加和删除。
我使绑定工作了,因此通过将列表设置为ObservableCollection类型来显示列表(如果有任何条目)。 但是,如果它们为空,则列标题将消失,因此,用户无法输入正确类型的新行,这是必需的。
这是我现在用来启动集合的方法:
foreach (var lvm in ListOfValues)
{
Type listType = lvm.GetListType();
string lvmName = listType.Name;
// Create ObservableCollection
ObservableCollection<object> observableCollection = new ObservableCollection<object>
{
// add a basic line to signal the list type - THIS IS A WORKAROUND
Activator.CreateInstance(listType),};
TemplateEntries.Add(new TemplateEntry { ListName = lvmName,Values = observableCollection });
}
该类中的每个TemplateEntry都包含之前命名的数据列表。 TemplateEntries属性只是TemplateEntries的ObservableCollection:
public ObservableCollection<TemplateEntry> TemplateEntries { get; set; } = new ObservableCollection<TemplateEntry>();
public class TemplateEntry : ObservableObject
{
public string ListName { get; set; }
public ObservableCollection<object> Values { get; set; }
public int Count { get { return Values.Count; } }
}
在XAML中,到目前为止我只显示以下行:
<DataGrid Grid.Column="0" Grid.Row="1" Margin="5,5,5" AutoGenerateColumns="True" Name="Grid" CanUserAddRows="True" ItemsSource="{Binding ValuesToDisplay}" />
所以我的问题是:如何删除Activator.CreateInstance Line解决方法,并向数据网格发出信号通知它应使用哪种类型?
解决方法
一段时间后,我自己弄清楚了。解决方案是使用非通用类型IList代替ObservableCollection作为TemplateEntry类的Values,然后将ObservableCollection强制转换为它(在使用Reflection创建它之后)。 DataGrid会接受这一点。
foreach (var lvm in ListModel.ListVMs)
{
Type listType = lvm.GetListType();
string lvmName = listType.Name;
Type collectionType = typeof(ObservableCollection<>).MakeGenericType(listType);
// Create ObservableCollection
IList observableCollection = (IList)Activator.CreateInstance(collectionType);
TemplateEntries.Add(new TemplateEntry { ListName = lvmName,Values = observableCollection });
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。