在运行时遵循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来显示/隐藏列也是出于同样的原因(我认为)。
答案 0 :(得分:1)
我同意DataGrid.Columns无法绑定是一种痛苦。我在这里的建议是在ObservableCollection中定义ViewModel中的列。在View(代码隐藏)中,处理此ObservableCollection的CollectionChanged事件,并修改代码中的DataGrid.Columns。
虽然这种解决方案不那么优雅,但它很简单。对于ViewModel,您可以单独测试在添加,删除或移动列时正确引发CollectionChanged事件。 View代码无法测试,所以我想这是你需要的东西。优点是,如果有一天DataGrid.Columns属性可以数据绑定,那么很容易重构它以删除后面的代码。
另一种方式(我认为)是创建附加行为或混合行为来处理这个问题。将它附加到DataGrid;而不是直接绑定到DataGrid.Columns,绑定到行为上的属性,并让行为直接修改DataGrid(AssociatedObect)。
这有意义吗? 干杯, 劳伦