2

在运行时遵循 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 显示/隐藏列也是不确定的(我认为)。

4

1 回答 1

1

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

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

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

那有意义吗?干杯,劳伦特

于 2010-05-07T14:23:32.140 回答