0

我在 ItemTemplate 上有一个带有 Label1 和 Button1 的 DataRepeater1。这三个控件绑定到一个 BindingList(Of T),其中 T 是 atm,一个非常简单的类,它有一个字符串属性

当用户单击 DataRepeater 项的按钮之一时,它会更新绑定数据列表中的字符串。IE 如果用户单击DataRepeater 中第0 项上的按钮,则BindingList 中相同索引处的字符串会发生变化。

这有效

什么不起作用是在字符串更改之后,DataRepeater 应该更新相关项目的 Label1,因为它绑定到该字符串 - 但它没有。

谁能告诉我为什么??我当前的代码如下。谢谢

Imports System.ComponentModel

Public Class Form1
    Class ListType
        Public Sub New(newString As String)
            Me.MyString = newString
        End Sub
        Public Property MyString As String
    End Class
    Dim MyList As New BindingList(Of ListType)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Bind BindingList to DataRepeater.
        Label1.DataBindings.Add("Text", MyList, "MyString")
        DataRepeater1.DataSource = MyList

        ' Add some items to the BindingList.
        MyList.Add(New ListType("First"))
        MyList.Add(New ListType("Second"))
        MyList.Add(New ListType("Third"))
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' Use the Index of the current item to change the string 
        '  of the list item with the same index.
        MyList(DataRepeater1.CurrentItemIndex).MyString = "Clicked"

        ' Show all the current list strings in a label outside of 
        '  the DataRepeater.
        Label2.Text = String.Empty
        For Each Item As ListType In MyList
            Label2.Text = Label2.Text & vbNewLine & Item.MyString
        Next
    End Sub
End Class
4

2 回答 2

2

看看INotifyPropertyChanged

INotifyPropertyChanged 接口用于通知客户端(通常是绑定客户端)属性值已更改。

正是使用这种机制,BindingList该类能够将单个对象的更新推送到DataRepeater.

如果您在 中实现INotifyPropertyChanged接口TBindingList将通知您任何更改T并将其转发给DataRepeater您。您只需要在PropertyChanged属性发生更改时引发事件(在属性的设置器中T)。

.NET Framework 文档对使用这种方法进行了演练。

于 2013-11-28T20:59:47.667 回答
0

嗯,这似乎很奇怪,但经过进一步的实验,我发现不是直接更改字符串,而是创建对象的副本,更改字符串并使相关索引处的对象等于副本有效。

如:

    Dim changing As ListType = MyList(DataRepeater1.CurrentItemIndex)
    changing.MyString = "Clicked"
    MyList(DataRepeater1.CurrentItemIndex) = changing

或更短的版本:

    MyList(DataRepeater1.CurrentItemIndex).MyString = "Clicked"
    MyList(DataRepeater1.CurrentItemIndex) = MyList(DataRepeater1.CurrentItemIndex)

似乎 BindingList 以某种方式仅在整个对象更改而不是对象的成员时通知 DataRepeter ...

于 2013-09-05T13:09:22.427 回答