显示2项时,WPF绑定了Listbox错误

时间:2014-07-29 15:31:29

标签: wpf missing-data

我的窗口中有一个WPF列表框。在窗口的Load事件中,我创建了一个List(of Object),并添加了一些项目。在应用程序启动或调试时,我可以看到项目。 如果我在列表中添加1项,我正确地看到1项。如果我添加3个或更多项目,我正确地看到3个或更多项目。如果我只添加2项,我只看到1项。为什么呢?

这是我的WPF代码

<Window x:Class="Cacatua.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Cacatua;assembly=" >

    <Grid>
        <ListBox Name="lbSearch" ItemsSource="{Binding}" />
    </Grid>
</Window>

这是我的代码隐藏(同一个程序集,在Cacatua命名空间中):

Private myLstSearch As List(Of Object)

Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
     myLstSearch = New List(Of Object)
     lbSearch.ItemsSource = myLstSearch
     Dim myMedia1 as Media1

     myMedia1 = New Media1("IdMedia1-A")
     myLstSearch.Add(myMedia1)

     myMedia1 = New Media1("IdMedia1-B")
     myLstSearch.Add(myMedia1)
End Sub

其中Media1是一个包含字符串

的简单类
Public Class Media1
    Private myIdTitolo As String
    Public ReadOnly Property IDTitolo As String
        Get
            Return (myIdTitolo)
        End Get
    End Property
    Public Sub New(str As String)
        myIdTitolo = str
    End Sub
End Class

使用此代码,我会看到一个包含此输出的列表(没有datatemplate):     Cacatua.Media1     Cacatua.Media1

但我只看到了     Cacatua.Media1

我认为这是一个错误。但我是第一个遇到这个问题的人吗?

1 个答案:

答案 0 :(得分:0)

您有正确的想法,但问题是您的ItemsSource无法知道何时更新,因为您未使用ObservableCollection。渲染和加载窗口之间也存在时间问题,我认为这与您没有正确绑定项目源的事实有关。

对于初学者,请尝试将myLstSearch的类型更改为ObservableCollection(Of Media1)

此外,更好的方法是直接从XAML中对其进行数据绑定,因此您的代码隐藏将类似于:

Public property MyListSearch As ObservableCollection(Of Media1)

然后你的XAML看起来像:

<Window x:Class="Cacatua.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Cacatua;assembly=">

    <Grid>
        <ListBox Name="lbSearch" ItemsSource="{Binding Path=MyListSearch}" />
    </Grid>
</Window>

这样,您只需在窗口构造函数中初始化MyListSearch,然后随时添加元素,同时视图将自动更新。