我有一个UserControl,带有TextBox和数据绑定属性 - Value。 值可以是任何对象,如颜色,数组,字体等。 只要文本更改,只要有效,属性值就会更改。
查看msdn文章:How to: Apply the PropertyNameChanged Pattern ,它说我应该使用PropertyNameChanged Event pattern 从控制方面来说。
现在,如果我有DataSourceUpdateMode = OnValidate,那么我甚至不需要应用这种模式。如果,比方说。我的Value属性绑定到业务对象中的颜色字段,然后在我键入红色后,在文本框和选项卡中指向另一个字段,然后立即更新表单上绑定到同一颜色字段的任何其他字段。 / p>
但是,如果我的DataSourceUpdateMode = OnPropertyChange,我希望表单上的所有其他字段在我按下'd'后立即更新(如re'd')。
这不会发生。 所以,我应用前面提到的PropertyNameChanged模式,但它仍然没有发生。
但是,如果我删除PropertyNameChanged事件,而是使用INotifyPropertyChanged,它可以完美地工作。
我的问题是,根据文章,INotifyPropertyChanged应该由业务对象使用,而不是用户控件。
它有效,但我不想遇到任何未来的问题。
任何人都知道发生了什么事?
假设可以使用INotifyPropertyChanged,我现在还有一个问题。 我不希望用户必须订阅'PropertyChanged'事件,然后检查参数以查看属性'Value'是否发送了它。 所以,我补充说:
Public Event ValueChanged As EventHandler(Of EventArgs)
这打破了绑定。在验证时甚至没有更新源,更不用说更改属性了。
我认为我必须将ValueChanged事件重命名为FeckingValueChanged或其他东西。
如果框架实际上首先使用引发的ValueChange事件做了一些事情,我不介意这么多!
答案 0 :(得分:0)
好的,我发现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将不起作用。
例如,由于某种原因,以下内容不起作用:
Public Event DataSourceChanged As EventHandler( Of EventArgs )
使用INotifyPropertyChanged也可以,但是你也不能拥有预期的PropertyNameChanged事件,用户希望能够订阅它。