我有一个案例,在Datagrid的列中没有修复。即必须根据某些条件生成它。
如何将值存储在数据库中,并使用MVVM模式显示数据网格。
P.S:我有一个主网格和一个子网格,根据他在主网格中选择的值,我需要形成下面的网格。我还担心将它存储在DB中,因为可以有5列或有时20列。
任何类似的链接或参考也会有用。
答案 0 :(得分:2)
这可以完全以符合MVVM的方式完成,但对于初学者来说不一定是微不足道的,并且不适合简单的应用程序。
我喜欢使用的一种方法是在数据库 1 中序列化一系列列描述符。列描述符只是我自己的custom DTO data classes并且包含与列相关的属性,即宽度,列类型,是否可见,是否可以切换可见性,它是序数等等。这都是使用简单结构完成的和/或原始.Net类型,但特别是 2 中没有任何与UI相关的数据类型。
此ColumnDescriptors
列表可以是serialiased to and from XML,并以nvarchar或XML column存储在数据库中。特别是在SQL Server上,XML列更好,因为您可以本地查询存储在数据库列中的XML结构。
因为它是一个UI布局的东西,所以由视图来查询数据库中正确的列描述符集,然后我通过static GridColumnFactory class抽取该集合,迭代描述符对象并创建我适当的网格列并为它们分配适当的值。一旦工厂返回该集合,视图就可以将它们添加到DataGrid的列集合中。
这种方法的好处:
如果我换掉所使用的DataGrid(即从一个供应商换到另一个供应商,比如说DevExpress到ComponentOne或native WPF),我可以简单地改变从工厂类返回的列类型< / p>
如果我在UI中交换任何内容,那么我不需要触摸存储的列描述符。
与XML串行化意味着如果我从描述符中添加/删除属性,那么旧的存储副本仍然可以容纳,它们在我发布更新时不会立即被破坏
最好的功能之一是我可以使用简单的SQL语句更改存储的列布局,我不必也发布已编译的代码
最后一件事 - 使用列描述符使得实现用户指定的布局变得微不足道,即当你让它们拖动列然后想要保存下次布局时
如果我想变得非常时髦,可以从网络服务返回列描述符
1 对于网站,这些文件也可以存储在松散的XML文件中,然后将其读入并保存在缓存中。
2 对于这种方法,您应该始终避免使用专门的或供应商特定的数据类型,因为它们不一定很好地序列化(如果有的话),并且将成为未来的一个弱点 - 这些将是你必须改变的最可能的事情,如果这些改变你就会破坏你已经存在的任何存储描述符。