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

标签 silverlight xaml datagrid mvvm mvvm-light

在运行时遵循 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/

相关文章:

php - SELECT * FROM 给出其他结果,然后 SELECT 2010,2011 FROM

c# - 仅当数据更改时才允许用户保存的更好方法?

wpf - 设置属性 'Prism.Regions.RegionManager.RegionName' 引发异常

c# - 对调度程序和异步感到困惑

javascript - 具有固定标题和滚动问题的 Datagrid 滚动条

javascript - Material-UI DataGrid 组件使用新状态数据刷新

Silverlight TreeView-展开节点时加载数据

c# - 等待多个任务显示在 GUI 中

silverlight - 为什么 Silverlight 4 Tools 只提供部分智能感知?

c# - WPF-组合框选择已更改显示最后选择的项目而不是当前项目