【问题标题】:Dynamically specify and change a Silverlight DataGrid's columns during runtime (MVVM)在运行时动态指定和更改 Silverlight DataGrid 的列 (MVVM)
【发布时间】:2011-02-15 16:21:50
【问题描述】:

在运行时遵循 MVVM 模式在 Silverlight DataGrid 控件中动态指定 DataGrid 列的最佳方法是什么?

我想做的是将“DataGrid.Columns”属性绑定到我的 ViewModel 中的一个属性,这样,如果用户添加/删除列,我只需更新 ViewModel 属性,DataGrid 就会发生变化。问题是,“DataGrid.Columns”属性不能绑定(我不认为)。

由于此属性不可用,DataGrid 控件本身在 ViewModel 级别不可用,我目前的方法是跳出 MVVM 模式以实现此特定实现,并使用 MVVM Light 的 Messenger 在 View 的代码隐藏中捕获某些事件类,然后直接与 DataGrid 控件对话以实现此功能。我知道这是对这种方法的一般性陈述,没有细节,但有没有更简单的方法......或者可能不是那么容易,但是更好地遵循 MVVM 模式的更好方法?

DataGrid 控件的 Columns 属性无法绑定,这让我快疯了……看起来很简单。

仅供参考 - 在建议使用 AutoGenerateColumns = True 之前,为绑定到 DataGrid.ItemsSource 的集合中的每个项目绑定的类没有单独的属性来识别绑定到列的内容......它是一个集合属性包含列以保持它们完全动态,以便特定路径消失。此外,出于同样的原因,处理 AutoGeneratingColumns 并使用 e.Cancel 显示/隐藏列也是不确定的(我认为)。

【问题讨论】:

  • 因此,在发布此内容后,我的脑海中突然出现了这个想法。如果我的模型类像 DataTable 一样,其中的列是动态的并且可以添加/删除,那不是很好吗随意,并且当 AutoGenerateColumns = true 时,DataGrid 控件可以识别此属性 (DataTable.Columns),因此可以实现动态列。但问题是,我如何以一种可以由 Silverlight DataGrid 控件解释的方式编写我的 Model 类(除了从 DataTable 类继承的明显方式,我不想这样做......我不认为)?
  • 此评论无效。与 WPF 不同,Silverlight 似乎没有此功能。

标签: silverlight xaml datagrid mvvm mvvm-light


【解决方案1】:

我同意 DataGrid.Columns 无法绑定是一种痛苦。我的建议是在 ObservableCollection 中定义 ViewModel 中的列。在View(后面的代码)中,处理这个ObservableCollection的CollectionChanged事件,并在代码中修改DataGrid.Columns。

虽然这个解决方案不太优雅,但它很简单。对于您的 ViewModel,您可以对添加、删除或移动列时正确引发 CollectionChanged 事件进行单元测试。 View 代码无法测试,所以我想这是你需要忍受的东西。好处是,如果有一天 DataGrid.Columns 属性可以被数据绑定,那么很容易重构它以删除后面的代码。

另一种方法(我认为)是创建附加行为或混合行为来处理此问题。将其附加到 DataGrid;而不是直接绑定到 DataGrid.Columns,而是绑定到行为的属性,并让行为直接修改 DataGrid(AssociatedObect)。

这有意义吗? 干杯, 洛朗

【讨论】:

  • 在决定实施你的第一个建议后,我同意它“不太优雅”但完成了工作,我偶然发现了我正在测试的另一种方法。这里详细介绍的类:goo.gl/DsO3 Bodurov 先生使用 IL 动态创建一个具有属性的类,它允许我使用 DataGrid.AutoGenerateColumns = true 并直接绑定到 DataGrid 列自动显示的集合......所以我们可以在 VM 中潜在地绑定到它。这是有希望的,但我正在尝试解决一些问题,比如绑定到模型的值传播。
  • 听起来很有趣,完成后请写博客,我很想听听你的经历。
猜你喜欢
  • 2013-12-17
  • 2011-01-09
  • 2010-11-02
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多