【发布时间】:2010-07-07 13:28:18
【问题描述】:
据我(想)了解,在 ModelView 中实现 INotifyPropertyChanged 允许在修改属性的情况下引发 PropertyChanged 事件。
这样,视图应该会收到底层属性已更改的通知,因此 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(); }
}
凯夫
【问题讨论】:
-
只是为了澄清一下,在您的代码示例中 PropertyA 是 ObservableCollection 而 PropertyB 是字符串?您说您将 PropertyA(ObservableCollection)绑定到 TextBox?
-
A DataGrid 绑定到 PropertyA,TextBox 绑定到 PropertyB
标签: .net wpf mvvm mvvm-light