使用Collectionviewsource重新填充列表框

时间:2014-04-17 22:53:03

标签: wpf vb.net xaml listbox

我的第一个问题!我对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和一些暴力的理解。

提前致谢。

1 个答案:

答案 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()

相关问题