【问题标题】:Update ListBox after Change SortDescription in CollectionViewSource在 CollectionViewSource 中更改 SortDescription 后更新 ListBox
【发布时间】:2014-11-18 11:30:12
【问题描述】:

我的应用程序中有一个 ListBox,有一个 CollectionViewSource 作为 ItemsSource。 CollectionViewSource 中有一个 SortDescription。会有很好的效果。

但现在我有一个事件将更改 SortDescription。这工作正常,但 ItemsSource 不会刷新。当我尝试使用 CollectionViewSource.View.Refresh() 更新 ItemsSource 时,我会因为 CollectionViewSource.View 为空而变成错误。

这是我使用的代码:

CollectionViewSource:

<Grid.Resources>
    <CollectionViewSource Source="{Binding Path=Vertraege}" x:Key="VertraegeSource">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Vertrag.Gruppe.ID" Direction="Ascending" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Grid.Resources>

列表框

<ListBox Name="lb_Vertraege" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" ItemTemplate="{StaticResource VertragsListBoxTemplate}" ItemsSource="{Binding Source={StaticResource VertraegeSource}}" ScrollViewer.VerticalScrollBarVisibility="Visible">    

有任何想法,我可以在修改 SortDescription 后更新 ItemsSource 吗?目前我用这个 C# 代码试试这个:

ControlTemplate template = this["LeistungserbringerVertraegeTemplate"] as ControlTemplate;
Grid grid = template.LoadContent() as Grid;

CollectionViewSource viewSource = grid.FindResource("VertraegeSource") as CollectionViewSource;

viewSource.SortDescriptions.Clear();
viewSource.SortDescriptions.Add(new System.ComponentModel.SortDescription("VertragsID", System.ComponentModel.ListSortDirection.Ascending));

viewSource.View.Refresh();

【问题讨论】:

  • 顺便说一下,ListBox 和 Grid 位于带有 CodeBehind-File 的 ResourceDictionary 中。

标签: c# wpf listbox collectionviewsource


【解决方案1】:

根据我的经验,Template.LoadContent() 非常不寻常,在 WPF 中不推荐使用。

获取 CollectionView 的常用方法是从承载 ItemsSource 的 ItemsControl 中获取它:

ICollectionView collectionView = CollectionViewSource.GetDefaultView(lb_Vertraege.ItemsSource);

然后将您的排序描述添加到过滤器委托:

collectionView.Filter = ... // your sort descriptions

【讨论】:

  • 请注意,CollectionViewSource 是“CollectionView 类的 XAML 代理”(MSDN)。 collectionView 类本身代表一个视图。去“我有一个 CollectionViewSource 作为 ItemsSource”是错误的方式。如果您的 ItemsSource 为 null,则必须初始化数据并设置 ItemsSource。这根本不影响 CollectionView。当您拥有有效的 ItemsSource 时,您可以即时更改过滤器设置,而无需将 ItemsSource 设置为 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2011-07-14
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2011-08-11
  • 2013-04-17
相关资源
最近更新 更多