CollectionViewSource初始化引发了listbox的SelectionChanged

时间:2011-12-14 15:37:44

标签: c# wpf listbox collectionviewsource selectionchanged

可能是我错过了什么,但我已经用这个打败了我的头。

我定义了CollectionViewSource:

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

和ListBox:

<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

那里。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

尝试将以下内容添加到ListBox xaml。

IsSynchronizedWithCurrentItem="false"

答案 1 :(得分:1)

当您为ListBox分配源时,会创建packagesViewSource CollectionViewSource的DefaultView。并且它已选择第一个元素。因此,在分配源时,请分3步执行:

  1. 获取资源的DefaultView,然后
  2. 此视图上的MoveCurrentToPosition(-1),然后
  3. 将具有正确当前位置的视图分配给ListBox。