我的窗口中有一个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
我认为这是一个错误。但我是第一个遇到这个问题的人吗?
答案 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
,然后随时添加元素,同时视图将自动更新。