0

据我(想)了解,在 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(); }
        }

凯夫

4

3 回答 3

2

以下是数据对象实现 INotifyPropertyChanged 时数据对象和 UI 元素之间的通知如何工作的快速回顾。

1) 调用数据对象的属性设置器来更改属性。

2) 在 setter 中,数据对象更改属性值并引发事件以通知绑定到数据对象的任何 UI 元素属性已更改。引发的事件将包含刚刚更改的属性的名称。

3) UI 元素处理事件并检查事件参数以确定更改了哪个属性。

4) 现在 UI 元素知道哪个属性已更改,它调用适当的 getter 来获取最新的属性值,并使用该值更新自身。

所以,在你的例子中。如果更新了属性“ProjectedDate”,则会引发一个事件,将属性名称“ProjectedDate”传递给 UI 元素。UI 元素随后将调用“ProjectedDate”属性的 getter 来刷新自身。

如果从未使用属性名称“PropertyB”作为参数引发事件,则 UI 元素不知道“PropertyB”已更改。因此,如果它绑定到“PropertyB”,它不会用新值刷新自己。在某些时候,必须使用属性名称“PropertyB”引发事件作为 UI 元素的事件论证,以了解它需要使用最新的属性值刷新自身。

于 2010-07-07T15:50:34.663 回答
0

您是否在文本框上设置了绑定?

<TextBox Text="{Binding Path=PathToMyValue}"/>
于 2010-07-07T13:43:01.873 回答
0

在 DataGrid 中的数据模板内的控件中绑定到 PropertyB 将不起作用,因为控件的数据上下文将是 ViewModelB。如果要将数据模板内的元素绑定到数据模板上下文之外的内容,则需要将其数据上下文设置为其他内容,或者使用元素到元素的数据绑定来绑定到数据模板之外的内容。

于 2010-07-07T22:14:49.143 回答