我有一个用户控件,具有文本框和数据绑定属性 - 值。 值可以是任何对象,如颜色,阵列,字体等 任何时间的文本改变时,属性值被限制,只要其是有效的改变。

看着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事件,哪些用户会希望能够订阅。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top