Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ObservableCollection上使用CollectionViewSource进行列表框实时排序_C#_Wpf_Xaml_Sorting_Listbox - Fatal编程技术网

C# 在ObservableCollection上使用CollectionViewSource进行列表框实时排序

C# 在ObservableCollection上使用CollectionViewSource进行列表框实时排序,c#,wpf,xaml,sorting,listbox,C#,Wpf,Xaml,Sorting,Listbox,我希望能够对绑定到ObservableCollection的列表框项目进行实时排序;我还想通过我的XAML标记(如果可能的话)专门启用实时排序。目前情况下,列表在应用程序启动时正确排序,但当新项目添加到ObservableCollection时,只需将项目追加(未排序)到列表框中 在我的viewmodel中,我具有以下公共属性: public ObservableCollection<Equipment> EquipmentList { get; set; } publicobse

我希望能够对绑定到ObservableCollection的列表框项目进行实时排序;我还想通过我的XAML标记(如果可能的话)专门启用实时排序。目前情况下,列表在应用程序启动时正确排序,但当新项目添加到ObservableCollection时,只需将项目追加(未排序)到列表框中

在我的viewmodel中,我具有以下公共属性:

public ObservableCollection<Equipment> EquipmentList { get; set; }
publicobservableCollection设备列表{get;set;}
设备是从实体框架自动生成的类,它包含一个名为“Description”的公共字符串属性。这是我的分类目标

My XAML具有以下数据模板,用于启用实时排序:

<DataTemplate x:Key="EquipmentDescriptionTemplate" 
                      DataType="{x:Type e:Equipment}">
    <DataTemplate.Resources>
        <CollectionViewSource x:Key="SortedEquipmentList" 
                              Source="{Binding Path=Description, 
                                  Mode=OneWay, 
                                  UpdateSourceTrigger=PropertyChanged}" 
                                  IsLiveSortingRequested="True">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Description" 
                                     Direction="Ascending"/>
            </CollectionViewSource.SortDescriptions>
            <CollectionViewSource.LiveSortingProperties>
                <clr:String>Description</clr:String>
            </CollectionViewSource.LiveSortingProperties>
        </CollectionViewSource>
    </DataTemplate.Resources>
    <TextBlock Text="{Binding Path=Description}" />
</DataTemplate>

描述
最后是XAML列表框项:

<ListBox x:Name="EquipmentList" 
     ItemsSource="{Binding Path=EquipmentList, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" 
     ItemTemplate="{StaticResource EquipmentDescriptionTemplate}" 
     IsSynchronizedWithCurrentItem="True" 
     SelectedItem="{Binding EquipmentSelection, UpdateSourceTrigger=PropertyChanged}" 
     Grid.ColumnSpan="2" Grid.Row="1" Margin="5,5,5,5"/>

为了让实时排序正常工作,我不顾一切地尝试添加了很多额外的属性(如果有疑问,请大胆猜测!)。我把它们留在家里,这样人们就可以看到我试过的东西,然后窃笑


如何通过XAML启用实时列表框排序?

您需要将ItemsSource绑定到CollectionViewSource,而不是基础集合:

<ListBox x:Name="EquipmentList" 
         ItemsSource="{StaticResource SortedEquipmentList}" 
         ...
         />

将CollectionViewSource放在页面的资源字典中上方的某个位置。将其源绑定到基础集合(“设备列表”):


描述

执行此操作时,会出现以下设计时错误:“CollectionViewSource类型的对象无法应用于需要IEnumerable类型的属性。”是否需要执行其他操作才能将ItemsSource绑定到CollectionViewSource项目?@StardewSource抱歉,我想你只需要
设备列表。查看
。我想我知道了。ItemsSource需要一些小的调整(我可能早就知道了,但我是n00b):
ItemsSource=“{Binding Source={StaticResource SortedEquipmentList}}”
。(顺便说一句,既然你编辑了我的原创文章,你是怎么做到的?如果我一开始就做对的话,我可能会节省很多人的精力。:@StardewJellyfeather我是怎么编辑这篇文章的?你应该在下面看到一个“编辑”按钮——你可以随时编辑自己的帖子,但是如果你在某个代表下,那么对其他人帖子的编辑将通过审查队列进行。对不起,我指的是XAML标记本身。当我并排看时,我的是纯文本,而你的是所有正确的颜色。我试图在原始帖子中使用`标记指定代码,但没有成功。
<CollectionViewSource x:Key="SortedEquipmentList" 
                      Source="{Binding EquipmentList.View}" 
                      IsLiveSortingRequested="True">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Description" Direction="Ascending"/>
    </CollectionViewSource.SortDescriptions>
    <CollectionViewSource.LiveSortingProperties>
        <clr:String>Description</clr:String>
    </CollectionViewSource.LiveSortingProperties>
</CollectionViewSource>