CollectionViewSource初始化会引发listbox's SelectionChanged

本文关键字:SelectionChanged listbox 初始化 CollectionViewSource | 更新日期: 2023-09-27 18:18:03

也许我错过了什么,但我已经用这个敲了我的头。

我定义了CollectionViewSource:

<CollectionViewSource x:Key="packagesViewSource" d:DesignSource="{d:DesignInstance my:Package, CreateList=True}" />

和列表框:

<ListBox Name="lstbPackages"
    SelectionChanged="lstbPackages_SelectionChanged"
    ItemsSource="{Binding Source={StaticResource packagesViewSource}}"
    DisplayMemberPath="Name"
    SelectedValue="{Binding Path=PackageId, UpdateSourceTrigger=Explicit}"
    SelectedItem="{Binding Path=Package}"
    SelectedValuePath="IdPackage"
/> 

另外,我有代码后面的packagesViewSource初始化:

private IQueryable<Packages> GetPackagesQuery()
{
    IQueryable<Package> query = dc.PackagesList;
    // Returns an ObjectQuery.
    return query;
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
   ...
   packagesViewSource =((System.Windows.Data.CollectionViewSource)(this.FindResource("packagesViewSource")));
   queryPackages = this.GetPackagesQuery();
   packagesViewSource.Source = queryPackages.ToList();
   ...
}

packagesViewSource.Source = queryPackages.ToList();

涉及事件

private void lstbPackages_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ...
}

lstbPackages.SelectedItem != null

我做错了什么?

CollectionViewSource初始化会引发listbox's SelectionChanged

尝试将以下内容添加到您的ListBox xaml.

IsSynchronizedWithCurrentItem="false"

当你给ListBox分配一个源时,你的packagesViewSource CollectionViewSource的DefaultView被创建。它选择了第一个元素。因此,在分配来源时,请分3步完成:

  1. 获取资源的DefaultView,然后
  2. movecurrenttposition(-1)在这个视图上,然后
  3. 将当前位置正确的视图分配给ListBox。