在运行时遵循 MVVM 模式在 Silverlight DataGrid 控件中动态指定 DataGrid 列的最佳方法是什么?
我想做的是将“DataGrid.Columns”属性绑定(bind)到我的 ViewModel 中的一个属性,这样,如果用户添加/删除列,我只需更新 ViewModel 属性,DataGrid 就会改变。问题是,“DataGrid.Columns”属性不能绑定(bind)(我不认为)。
因为这个属性不可用,DataGrid 控件本身在 ViewModel 级别也不可用,我目前的方法是跳出 MVVM 模式来实现这个特定的实现,并使用 MVVM Light 的 Messenger 类在 View 的代码隐藏中捕获某些事件,然后直接与 DataGrid 控件对话以实现此功能。我知道这是对这种方法的一般性陈述,没有详细信息,但有没有更简单的方法......或者可能不是那么容易,但是更好地遵循 MVVM 模式的更好方法?
无法绑定(bind) DataGrid 控件的 Columns 属性,这让我抓狂……这似乎是一件很简单的事情。
仅供引用 - 在建议使用 AutoGenerateColumns = True 之前,为绑定(bind)到 DataGrid.ItemsSource 的集合中的每个项目绑定(bind)的类没有单独的属性来识别绑定(bind)到列的内容......它是一个包含列,以保持它们完全动态,以便特定路径消失。此外,出于同样的原因,处理 AutoGeneratingColumns 并使用 e.Cancel 显示/隐藏列也是不确定的(我认为)。
最佳答案
我同意 DataGrid.Columns 无法绑定(bind)是一种痛苦。我的建议是在 ObservableCollection 中的 ViewModel 中定义列。在 View(后面的代码)中,处理这个 ObservableCollection 的 CollectionChanged 事件,并在代码中修改 DataGrid.Columns。
虽然这个解决方案不太优雅,但它很简单。对于您的 ViewModel,您可以对添加、删除或移动列时是否正确引发 CollectionChanged 事件进行单元测试。 View 代码无法测试,所以我想这是你需要忍受的东西。优点是,如果有一天 DataGrid.Columns 属性可以数据绑定(bind),那么很容易对其进行重构以删除后面的代码。
另一种方法(我认为)是创建附加行为或混合行为来处理这个问题。将其附加到 DataGrid;而不是直接绑定(bind)到 DataGrid.Columns,而是绑定(bind)到行为的属性,并让行为直接修改 DataGrid(AssociatedObect)。
那有意义吗?
干杯,
洛朗
关于silverlight - 在运行时动态指定和更改 Silverlight DataGrid 的列 (MVVM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2769118/