所以,当我有一个Datagrid,我想填充我的数据库中的数据。我通常使用我想要显示的Data设计一个ViewModel。但是,当我不知道它将显示在哪个数据中时,如何为我的Datagrid创建一个ViewModel?
因此,当我允许应用程序的用户从数据库表中指定要在Datagrid中显示的列时。我如何为这种情况设计ViewModel?
所以我希望它清楚我想做什么。
事先提前答案 0 :(得分:2)
有两种解决方案可供选择。
让ViewModel保留所有列,并在View上只选择用户。这不太理想。
在View数据上使用反射来确定ViewModel的列。
答案 1 :(得分:2)
我之前通过以下方式完成了这项工作:
使用XML文档描述所有可用列,它们的格式(即数字列的“#0.#0”)以及它们绑定的数据字段,它还描述了哪些列是默认值那些
此列描述XML是通过WCF调用服务器检索的(这是一个Silverlight项目)
网格列是由View使用网格列工厂生成的(这是由View完成的,因为它依赖于UI)。默认列设置为可见,其他列设置为不可见
ViewModel填充了包含列的所有数据的数据对象列表
用户可以右键单击网格,然后通过上下文菜单打开一个包含完整列列表的对话框,并在当前可见的标记旁边打勾(勾号)。此对话框由View管理/填充 - 因为ViewModel不应该知道有关实际UI的任何信息。您可能希望使用对话服务。对话框的VM将填充一个匿名对象列表,其中包含列标题和列的可见性状态。
当用户关闭对话框时,View将显示/隐藏相应的列(我更进一步 - 当用户检查对话框中的列时,它立即在网格中变得可见,以便用户知道他们选择合适的一个,当显示数十个列时,可能会非常相似。
使用XML文档描述列的优点是:
它与UI无关;我使用的网格组件无关紧要我所要做的就是更改工厂
XML文档可以单独更新为代码;如果客户端想要更改格式字符串,则不必重新编译代码。类似地,如果我将来需要显示更多数据,我需要更改的是我的XML文档,包含数据对象定义的程序集和DAL程序集 - V / VM根本不需要更改。
答案 2 :(得分:0)
您甚至需要创建视图模型吗?你不能只填充一个本地DataTable
并将DataGrid
绑定到它吗? ADO对象中融入了大量功能,DataGrid
与其中很多功能互操作。如果您确实需要DataRow
上的其他属性(比如命令,请说),您可以继承DataTable
和DataRow
并添加它们。这可以为您节省很多的工作。
无论您是创建DataTable
还是创建自己的类,一种相当简单的方法是将AutoGenerateColumns
设置为true
并处理DataGrid.AutoGeneratingColumn
事件。您可以挂钩要隐藏的列列表,然后在生成的列位于该列表中时将e.Cancel
设置为true。文档显示了这样的示例。