更改绑定数据时DataRepeater不会更新

时间:2013-09-05 12:46:07

标签: vb.net binding bindinglist datarepeater

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

当用户单击其中一个DataRepeater项目按钮时,它会更新绑定数据列表中的字符串。 I.E.如果用户单击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

2 个答案:

答案 0 :(得分:2)

看看INotifyPropertyChanged

  

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

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

如果您在INotifyPropertyChanged中实施T界面,BindingList会收到T的任何更改通知,并将其转发至DataRepeater您。只要更改了属性(在PropertyChanged属性的设置者中),您就必须引发T事件。

.NET Framework文档使用此方法有walkthrough

答案 1 :(得分: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而不是对象的成员......