MVVM如何为Datagrid设计ViewModel,用户选择哪些列

时间:2010-10-10 20:39:40

标签: c# wpf mvvm datagrid

所以,当我有一个Datagrid,我想填充我的数据库中的数据。我通常使用我想要显示的Data设计一个ViewModel。但是,当我不知道它将显示在哪个数据中时,如何为我的Datagrid创建一个ViewModel?

因此,当我允许应用程序的用户从数据库表中指定要在Datagrid中显示的列时。我如何为这种情况设计ViewModel?

所以我希望它清楚我想做什么。

事先提前

3 个答案:

答案 0 :(得分:2)

有两种解决方案可供选择。

  1. 让ViewModel保留所有列,并在View上只选择用户。这不太理想。

  2. 在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上的其他属性(比如命令,请说),您可以继承DataTableDataRow并添加它们。这可以为您节省很多的工作。

无论您是创建DataTable还是创建自己的类,一种相当简单的方法是将AutoGenerateColumns设置为true并处理DataGrid.AutoGeneratingColumn事件。您可以挂钩要隐藏的列列表,然后在生成的列位于该列表中时将e.Cancel设置为true。文档显示了这样的示例。