0

我有一个用户控件,带有一个文本框和一个数据绑定属性 - 值。Value 可以是任何对象,例如 Color、Array、Font 等。只要文本更改,属性 Value 就会更改,只要它有效。

查看 msdn 文章:如何:应用 PropertyNameChanged 模式 ,它说我应该 从控制端使用PropertyNameChanged 事件模式。

现在,如果我有 DataSourceUpdateMode = OnValidate,那么我什至不需要应用此模式。如果,说。我的 Value 属性绑定到业务对象中的颜色字段,然后在我在文本框和选项卡中键入 red 后,再到另一个字段,然后表单上绑定到相同颜色字段的任何其他字段都会立即更新。

但是,如果我的 DataSourceUpdateMode = OnPropertyChange,我希望表单上的所有其他字段在我按下“d”后立即更新(如 re'd')。

这不会发生。所以,我应用了前面提到的 PropertyNameChanged 模式,但它仍然没有发生。

但是,如果我删除 PropertyNameChanged 事件,而是使用 INotifyPropertyChanged,它会完美运行。

我的问题是,根据文章, INotifyPropertyChanged 应该由您的业务对象使用,而不是用户控件。

它有效,但我不想遇到任何未来的问题。

有人知道发生了什么吗?

预计到达时间:

假设可以使用 INotifyPropertyChanged,我现在还有一个问题。我不希望用户必须订阅“PropertyChanged”事件,然后检查参数以查看属性“Value”是否发送了它。所以,我补充说:

Public Event ValueChanged As EventHandler(Of EventArgs)

这打破了绑定。源代码甚至没有更新验证,更不用说属性更改了。

我想我必须将 ValueChanged 事件重命名为 FeckingValueChanged 之类的。

如果框架实际上首先对引发的 ValueChange 事件做了一些事情,我不会太介意!

4

1 回答 1

1

好的,我发现 MSDN 提供的代码不正确。下面,我突出显示了不正确的部分并显示了更正:

不正确

Public DataSourceChanged As EventHandler

Private Sub OnDataSourceChanged() 
    If (DataSourceChanged IsNot Nothing) Then
        DataSourceChanged(Me, New EventArgs())
    End If
End Sub

正确的

Public **Event** DataSourceChanged As EventHandler

Private Sub OnDataSourceChanged() 
    If (DataSourceChangedEvent IsNot Nothing) Then
        **RaiseEvent** DataSourceChanged(Me, New EventArgs())
    End If
End Sub

我发现您必须以这种精确的方式声明此事件,否则数据绑定 OnPropertyChanged 将不起作用。

例如,由于某种原因,以下内容将不起作用:

公共事件 DataSourceChanged 作为 EventHandler(的 EventArgs )

使用 INotifyPropertyChanged 也可以,但您不能同时拥有预期的 PropertyNameChanged 事件,用户希望能够订阅该事件。

于 2009-10-30T23:58:47.247 回答