绑定到VB.NET中的结构属性

时间:2013-01-27 16:06:00

标签: .net vb.net data-binding

我正在尝试将结构成员绑定到Windows Forms中的Label。但是,我无法做到这一点,因为这个结构是一个类的成员,我需要将几个成员绑定到Labels。

假设此结构为System.Drawing.Point,我想将XY属性绑定到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设置为Medatamember为结构,则Label1将显示ToString()方法的结果,Label2X属性和Label3不会改变。

但是,如果我将新的Point分配给Pt属性,则只有Label1会更新其值。 Label2不会,因为datasource不再相同。另外,Label3.DataBindings.Add("Text", Me, "Pt.Y")不起作用,因为datamember不可能是“子成员”。

我还试图在其所有属性中创建一个实现INotifyPropertyChanged的新结构,但没有运气。

是否有可能对Label2Label3进行绑定,即使我为其分配了新的结构?

我的目标是将新的Point分配给Me.Pt属性,并通过数据绑定在Pt.XPt.Y上观察Label2Label3的值

2 个答案:

答案 0 :(得分:0)

你几乎做对了。 Label1Label3将按原样运作。变化

Label2.DataBindings.Add("Text", Me.Pt, "X")

Label2.DataBindings.Add("Text", Me, "Pt.X")

Label2也将开始工作。

只需确保通过媒体资源指定新值,而不是通过_pt字段。

答案 1 :(得分:0)

我建议在您的表单中添加属性Pt_XPt_Y,使用Get方法只返回_pt.X_pt.Y的值。此外,您应该让Pt属性设置器检查是否要更改_pt.X_pt.Y,如果是,则引发相应的事件。

或者,您可以定义一个类,它将充当Point类和标签之间的接口。对pt的任何更改都会通知此类,然后该类将计算标签中应包含的内容并将其转发给相关标签。