我正在尝试将结构成员绑定到Windows Forms中的Label
。但是,我无法做到这一点,因为这个结构是一个类的成员,我需要将几个成员绑定到Labels。
假设此结构为System.Drawing.Point
,我想将X
和Y
属性绑定到Label
。
Imports System.ComponentModel
Public Class Form1
Implements INotifyPropertyChanged
Private _pt As Point
Public Property Pt As Point
Get
Return _pt
End Get
Set(value As Point)
_pt = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Pt"))
End Set
End Property
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Label1.DataBindings.Add("Text", Me, "Pt")
Label2.DataBindings.Add("Text", Me.Pt, "X")
Label3.DataBindings.Add("Text", Me, "Pt.Y")
End Sub
Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class
如果我将bindingsource
设置为Me
和datamember
为结构,则Label1
将显示ToString()
方法的结果,Label2
值X
属性和Label3
不会改变。
但是,如果我将新的Point
分配给Pt
属性,则只有Label1
会更新其值。 Label2
不会,因为datasource
不再相同。另外,Label3.DataBindings.Add("Text", Me, "Pt.Y")
不起作用,因为datamember
不可能是“子成员”。
我还试图在其所有属性中创建一个实现INotifyPropertyChanged
的新结构,但没有运气。
是否有可能对Label2
或Label3
进行绑定,即使我为其分配了新的结构?
我的目标是将新的Point
分配给Me.Pt
属性,并通过数据绑定在Pt.X
和Pt.Y
上观察Label2
和Label3
的值
答案 0 :(得分:0)
你几乎做对了。 Label1
和Label3
将按原样运作。变化
Label2.DataBindings.Add("Text", Me.Pt, "X")
到
Label2.DataBindings.Add("Text", Me, "Pt.X")
Label2
也将开始工作。
只需确保通过媒体资源指定新值,而不是通过_pt
字段。
答案 1 :(得分:0)
我建议在您的表单中添加属性Pt_X
和Pt_Y
,使用Get
方法只返回_pt.X
和_pt.Y
的值。此外,您应该让Pt
属性设置器检查是否要更改_pt.X
或_pt.Y
,如果是,则引发相应的事件。
或者,您可以定义一个类,它将充当Point
类和标签之间的接口。对pt
的任何更改都会通知此类,然后该类将计算标签中应包含的内容并将其转发给相关标签。