簡體   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