繁体   English   中英

ObservableCollection不排序

[英]ObservableCollection not Sorting

我正在编写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>

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

任何关于出了什么问题的指针将不胜感激。

我想在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;        
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM