【发布时间】:2021-07-03 16:11:33
【问题描述】:
响应式 UI 设计:DataGrid 输入自动引起更改 (MVVM)
我正在尝试创建一个简单的应用程序,其中我有一个图表工具,它接受集合作为要绘制的系列。我的计划是有一个输入 DataGrid 绑定到一个可以手动填充的集合。
基于DataGrid 中的值,然后我想同时填充一个不同的集合,该集合代表正在绘制的任何函数的definite integral,换句话说,一个不同的函数显示输入函数之间的区域和 x 轴。
随着DataGrid 的更新,我也想使用 MVVM 来响应更新图表,以显示输入数据和输出数据的变化。
A.应用部分(模型和结构)
我创建了一个包含my implementations so far 的要点。
1。主要部件
简而言之,应用程序具有以下组件:
-
Coordinate<T, U>具有 X 和 Y 属性(并使用INotifyPropertyChanged) -
ObservableCollection<Coordinate<double, double>>用于绘图目的 -
NumericalCalculator用于执行数值方法
2。转换器
在 WPF 聊天室中,Maverik 建议我可以使用值转换器让 WPF 完成繁重的工作,因此我编写了以下转换器:
-
CoordinateSeriesToStringConverter将坐标集合转换为字符串,其中所有坐标用逗号分隔 -
FunctionToEquallySpacedConverter尝试将坐标集合转换为包含一些n等间距坐标数的新集合 -
FunctionToIntegralConverter尝试将输入函数(坐标集合)积分到其两个边界之间的数值积分(目前尚未积分,用于测试目的)
B.我的实际问题:如何检测DataGrid 的项目源元素的变化?
我已经走了价值转换器路线,但事实证明,即使在我绑定的ObservableCollection 的元素上实现了INotifyPropertyChanged,这些更改也不会激活转换器。
我已经从sparedev 得到了一个很好的答案,但我可能会尝试使用不同的方法,但我仍然很好奇如何解决价值转换器问题。我敢肯定,如果我解决了这个问题,这两个选项同样可行。
更新:我尝试过 spadedev 的方法,但即使使用 INotifyPropertyChanged,从 UI 操作 DataGrid 的项目也不会引发任何新事件。添加新行或删除它们会引发CollectionChanged 事件,但不幸的是,仅此一项并不能让我响应地更新绘图。
【问题讨论】:
-
stackoverflow.com/questions/54020256/… -> reactiveui.net/docs/handbook/collections -> SynchronizedCollectionsViewModel
-
不幸的是,我只被允许使用几个 nuget 包,所以反应式 UI 虽然很有前途,但对我来说是一个死胡同。