我的第一个问题!我对vb适度熟悉,但是对于wpf来说是一个n00b。
我有一个带有列表框和按钮的表单。我从连接到Access数据库的数据集填充列表框。我正在使用的表名为Entries,只有两列,EntryID和Entry。当我单击该按钮时,会向数据库添加一个新条目,但不会重新填充列表框。
我已阅读此搜索的每个答案:“listbox collectionviewsource repopulate”但似乎没有解决我的具体问题。
我按以下方式设置我的资源:
<Window.Resources>
<CollectionViewSource x:Key="cvsEntries"
Source="{Binding Source={StaticResource TestDataSet}, Path=Entries}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Entry" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Window.Resources>
我按如下方式设置了列表框:
<ListBox Name="lstEntries"
DataContext="{StaticResource cvsStandardEntries}"
ItemsSource="{Binding}"
DisplayMemberPath="Entry" />
我点击事件的代码是:
Private Sub btnAdd_Click(sender As Object, e As RoutedEventArgs) Handles btnAdd.Click
Dim taEntries As TestDataSetTableAdapters.EntriesTableAdapter = New TestDataSetTableAdapters.EntriesTableAdapter
taEntries.Insert(NewEntryID, NewEntry)
数据库已正确更新,但列表框未正确更新。根据我对绑定的理解,它应该是。我在整体方法中做错了什么,或者我在列表框和/或按钮代码中遗漏了什么。
我知道我可以将此代码添加到按钮中:
With taEntries
.ClearBeforeFill = True
.FillByCategory(Entry, EntryID)
End With
我可以强制列表框更新,但这似乎违反了我对Binding和一些暴力的理解。
提前致谢。
答案 0 :(得分:0)
首先,访问?悲伤的脸......
其次,你的DataContext使用有点奇怪。试试这个:
<ListBox Name="lstEntries"
ItemsSource="{Binding Source={StaticResource cvsStandardEntries}}"
DisplayMemberPath="Entry" />
第三,TestDataSet不是 observable ,因此对数据库所做的更改不会自动填充回WPF。理想情况下,您应该抽象出数据层 - 在这种情况下,因为您在UI中显示可能会动态更改的项目列表,您应该使用{{1}之类的内容}}
也就是说,如果您不想付出努力,可以手动刷新收藏视图:
Dim collectionView As ICollectionView = TryCast(lstEntries.ItemsSource,ICollectionView) collectionView.Refresh()