数据绑定用户控件和PropertyNameChanged事件在.NET的WinForms问题
-
22-07-2019 - |
题
我有一个用户控件,具有文本框和数据绑定属性 - 值。 值可以是任何对象,如颜色,阵列,字体等 任何时间的文本改变时,属性值被限制,只要其是有效的改变。
看着MSDN文章:如何:应用PropertyNameChanged模式一> ,它说我应该使用 PropertyNameChanged事件模式 从控制侧。
现在,如果我有DataSourceUpdateMode =的OnValidate的话,我甚至不需要应用这种模式。如果说。我的值属性绑定到色域在业务对象,在此之后I型红色,在文本框和标签另一字段,则表单上的任何其他字段,即结合相同颜色字段,被立即更新。
如果,然而,我的DataSourceUpdateMode = OnPropertyChange,我希望所有其他字段,在表格上,尽快我按“D”(如在re'd')。更新
此不会发生。 所以,我申请上述PropertyNameChanged模式,它仍然不会发生。
但是,如果我删除PropertyNameChanged事件,相反,使用INotifyPropertyChanged的,它完美的作品。
我的问题是,根据文章,INotifyPropertyChanged的是应该由你的业务对象使用,而不是用户控制。
它的工作原理,但我不希望运行到未来的任何问题。
任何人有任何想法,这是怎么回事?
ETA:
假定它是确定使用INotifyPropertyChanged的,我现在有一个进一步的问题。 我不希望用户能够订阅“的PropertyChanged”事件,然后检查参数,看看属性“值”寄的。 所以,我添加:
Public Event ValueChanged As EventHandler(Of EventArgs)
这打破了结合。源甚至没有更新的验证,更不用说在属性变化。
我相信我必须重命名ValueChanged事件到FeckingValueChanged或东西。
我不会介意这么多,如果框架实际上没有在第一位置升高ValueChange事件东西!
解决方案
确定,我发现,在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作为事件处理程序(的 EventArgs的中强>)
使用INotifyPropertyChanged的也可以,但是你不能也有预期PropertyNameChanged事件,哪些用户会希望能够订阅。