在运行时(MVVM)动态指定和更改Silverlight DataGrid的列

时间:2010-05-04 21:31:51

标签: silverlight xaml datagrid mvvm mvvm-light

在运行时遵循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来显示/隐藏列也是出于同样的原因(我认为)。

1 个答案:

答案 0 :(得分:1)

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

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

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

这有意义吗? 干杯, 劳伦