我想编写一个 ViewModel,它总是知道 View 中某些只读依赖属性的当前状态。
具体来说,我的 GUI 包含一个 FlowDocumentPageViewer,它一次显示来自 FlowDocument 的一个页面。FlowDocumentPageViewer 公开名为 CanGoToPreviousPage 和 CanGoToNextPage 的两个只读依赖属性。我希望我的 ViewModel 始终知道这两个 View 属性的值。
我想我可以用 OneWayToSource 数据绑定来做到这一点:
<FlowDocumentPageViewer
CanGoToNextPage="{Binding NextPageAvailable, Mode=OneWayToSource}" ...>
如果这是允许的,那将是完美的: 每当 FlowDocumentPageViewer 的 CanGoToNextPage 属性发生变化时,新的值将被下推到 ViewModel 的 NextPage 属性中,这正是我想要的。
不幸的是,这不能编译: 我得到一个错误说 “ CanGoToPreviousPage”属性是只读的,不能从标记设置。显然只读属性不支持 任何类型的数据绑定,甚至不支持相对于该属性的只读数据绑定。
我可以将 ViewModel 的属性设置为 DependencyProperties,并将 OneWay 绑定设置为相反的方向,但是我并不热衷于关注点分离(ViewModel 需要一个对 View 的引用,而 MVVM 数据绑定应该避免这一点)。
FlowDocumentPageViewer 不会公开 CanGoToNextPageChanged 事件,而且我不知道有什么好办法可以从 DependencyProperty 获得更改通知,除非创建另一个 DependencyProperty 来绑定它,这在这里似乎有点过了。
如何让 ViewModel 随时了解视图只读属性的更改?