.net winforms中的DataBound UserControl和PropertyNameChanged事件问题

时间:2009-10-30 10:56:55

标签: .net vb.net data-binding inotifypropertychanged

我有一个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应该由业务对象使用,而不是用户控件。

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

任何人都知道发生了什么事?

ETA:

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

Public Event ValueChanged As EventHandler(Of EventArgs)

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

我认为我必须将ValueChanged事件重命名为FeckingValueChanged或其他东西。

如果框架实际上首先使用引发的ValueChange事件做了一些事情,我不介意这么多!

1 个答案:

答案 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事件,用户希望能够订阅它。