ObservableCollection没有排序

问题描述 投票:0回答:1

我正在编写一个MVVM应用程序,但我遇到了Observable Collection的问题。 ObservableCollection在视图模型中保存为:

private ObservableCollection<Participant> _initiativeList;
public ObservableCollection<Participant> InitiativeList
{
    get { return _initiativeList; }
    set
    {
        _initiativeList = value;
        OnPropertyChanged("InitiativeList");
    }
}

在XAML中我有一个列表框:

    <ListBox x:Name="lvInitiativeList"
              DockPanel.Dock="Top"
              ItemsSource="{Binding Source={StaticResource InitiativeListCollection}}"
              ItemTemplate="{StaticResource ResourceKey=ParticipantDisplayPanel}"
              SelectedItem="{Binding Path=SelectedParticipant}"/>

它使用的collectionViewSource是:

<CollectionViewSource Source="{Binding Path=InitiativeList, Mode=OneWay}"
                      x:Key="InitiativeListCollection">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="InitiativeScore" Direction="Descending"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

和项目模板是:

<DataTemplate x:Key="ParticipantDisplayPanel">
    <uc:ParticipantDisplayPanel/>
</DataTemplate>

ParticipantDisplayPanel是UserControl,定义如下:

<UserControl x:Class="InitiativeList.View.UserControls.ParticipantDisplayPanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:InitiativeList.View.UserControls">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="..\Resources\CommonStyles.xaml"/>
                <ResourceDictionary Source="..\Resources\ConverterDictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <Border BorderBrush="{Binding Path=ActionState, Mode=OneWay, Converter={StaticResource BorderHighlight}}"  
            BorderThickness="3"
            CornerRadius="10"
            Background="{Binding Path=Kind, Mode=OneTime, Converter={StaticResource KindColor}}">
        <StackPanel Orientation="Horizontal"
                    Width="450"
                    Height="50"
                    Background="Transparent">
            <Border BorderBrush="Black"
                    BorderThickness="2"
                    Width="50"
                    Height="50"
                    CornerRadius="25"
                    Background="#FF8040">
            <TextBlock x:Name="tbInitiative"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       FontSize="30"
                       Text="{Binding Path=InitiativeScore, 
                                      Mode=OneWay, 
                                      Converter={StaticResource InitiativeScore}}"/>
            </Border>
            <TextBlock x:Name="tbName"
                       Background="Transparent"
                       Width="250"
                       Height="25"
                       FontFamily="Ariel"
                       FontWeight="Bold"
                       FontSize="20"
                       Text="{Binding Path=Name, Mode=OneWay}"/>
            <TextBlock x:Name="Condition"
                       Background="Transparent"
                       Width="100"
                       Height="25"
                       Text="{Binding Path=Condition, Mode=OneWay}"/>
            <Border BorderBrush="Black"
                    BorderThickness="2"
                    Width="50"
                    Height="50"
                    CornerRadius="25"
                    Background="{Binding Path=Healthiness, Mode=OneWay, 
                                                              Converter={StaticResource HPBackground}}">
                <TextBlock x:Name="tbHitPoints"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           FontSize="25"
                           Text="{Binding Path=CurrentHitPoints, Mode=OneWay}"/>
            </Border>
        </StackPanel>
    </Border>
</UserControl>

当我向可观察集合中添加项目时,项目将出现在ListBox中,当我更新元素的属性时,ParticipantDisplayPanels会更新以反映更改的数据。但是,除非我专门为列表调用OnPropertyChanged,否则集合不会对这些更改进行排序,我希望将其作为ObservableCollection函数的一部分来完成,或者至少通过InitiativeList属性上的Set代码完成。在整个代码中加密OnPropertyChanged调用是不对的。难道我做错了什么?我在互联网上的所有搜索都没有出现一个Observable Collection的例子,我可以将其与我编写代码的方式联系起来。

关于出了什么问题的任何指示都将非常感激。

c# wpf xaml
1个回答
0
投票

我想在Observable集合上实现一些自定义排序,我就像下面那样做了然后绑定:

ItemsSource =“{Binding CollectionView}”......

List<SortDescription> SortDescriptions = new List<SortDescription>();

SortDescriptions.Add(new SortDescription("Field1", ListSortDirection.Ascending));
SortDescriptions.Add(new SortDescription("Field2", ListSortDirection.Ascending));
SortDescriptions.Add(new SortDescription("Field3", ListSortDirection.Ascending));
SortDescriptions.Add(new SortDescription("Field4", ListSortDirection.Ascending));


CollectionViewSource collectionViewSource = new CollectionViewSource();
public ICollectionView CollectionView
{
    get
    {
        collectionViewSource.Source = <YourObservableCollection>;
        if (SortDescriptions != null)
        {
            foreach (SortDescription sd in SortDescriptions)
            {
                collectionViewSource.View.SortDescriptions.Add(sd);
            }
        }

        collectionViewSource.View.Refresh();
        return collectionViewSource.View;        
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.