据我(想)了解,在 ModelView 中实现 INotifyPropertyChanged 允许在属性被修改的情况下引发 PropertyChanged 事件。
这样,应该通知 View 底层属性已更改,因此 UI 应该获取新的更改。
我的理论正确吗?
我面临的问题是我有一个绑定到 ViewModel 的 Infragistics DataGrid。一旦我更改了日期值,我就可以看到 ViewModel 上的属性是如何正确设置的以及事件是如何引发的。但是我还没有从外部订阅这个事件,UI 是如何得到通知的呢?
我问这个是因为我认为 UI 根本没有通知。我已经放置了第二个文本框,它将 ViewModel 绑定到相同的基础模型属性。但是,如果我使用 DataGrid 修改该属性,则 TextBox (Mode=OneWay) 不会自动更新。
我实际上利用 MVVM-Light Frame 工作并使用 ViewModelBase 而不是 INotifyPropertyChanged 并执行 RaisePropertyChanged(...)。但结果应该是相似的。
我是否必须以某种方式手动订阅 TextBox 到该事件?
编辑: 我已经解决了这个问题,但不明白为什么会这样。在回答问题之前,我需要进一步解释一下架构。Datgrid 绑定到 ViewModelA 中的 propertyA,它返回ObservableCollection<ViewModelB>.
ViewModelB 实际上包含 Grid 应该显示的所有属性。所有这些属性在它们的 Setter 中自然触发 OnProperyChanged。
TextBox 绑定到 PropertyB,它也存在于 ViewModelA 中。但它直接返回一个字符串,所以 PerpertyB 的底层 getter 返回:
_cashflowInputs[0].ProjectedDate.ToString();
但是,如果我不将 TextBox 绑定到此 propertyB,但也将其绑定到 PropertyA,则它可以工作:
有点奇怪。我期待它以同样的方式工作。两个属性都存在于同一个 ViewModel 上并访问同一个private ObservableCollection<ViewModelB>
,这有什么关系呢?
public ObservableCollection<ViewModelB> PropertyA
{
get { return _cashflowInputs;}
}
public string PropertyB
{
get { return _cashflowInputs[0].ProjectedDate.ToString(); }
}
凯夫