ObservableCollection的反向顺序

时间:2012-05-02 12:14:35

标签: c# wpf observablecollection

我的ObservableCollection包含自定义对象。 通常情况下,项目会在列表末尾添加

我在寻找:

  • 从列表的开头添加的项目。
  • 这可能只显示在用户界面中,我的整个程序已经在使用此列表中的数据位置。因此,其中的对象可能不会改变后面代码中的顺序。

ObservableColection包含Button对象(自定义样式)。这些按钮显示在ListBoxStackPanel内,水平布局(因此按钮可以很好地放在彼此之后)。

问题:

创建的每个按钮都会收到DateTime。新添加的按钮始终具有更新的日期,然后是之前的按钮。 所有这些计算都发生在计时器(目前每秒都在运行)中。

所以我基本上在这个时间排序,但是在突然按下3个按钮后,一个按钮放在右手边(而不是左手边)。

例如:

Btn3:14:15:45(正确) Btn4:14:16:00(错误) Btn2:14:15:32(正确)Btn1:14:04:17(正确)

每次都会在列表的开头正确添加前3个按钮。突然第四个项目被添加到第二个位置。似乎并不总是比较时间?每次创建一个按钮时,都会调用CollectionViewSource方法。

CollectionViewSource是否有问题,还是有更好的方法来解决这个问题?

4 个答案:

答案 0 :(得分:4)

对于笑话,你会尝试在XAML中进行排序吗?我知道这些名称不同,但这是来自工作代码。我没有按日期排序,但我已经完成了数百次添加并从DocProps中删除,并且排序不会中断。

        <ListBox.DataContext>
            <CollectionViewSource Source="{Binding Path=DocProps}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription PropertyName="Date" Direction="Desc" />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
        </ListBox.DataContext>

我的另一个想法是,它可能正在排序日期的字符串表示并将其弄错。也许创建一个索引001 - 00n来排序。

我在这个系列中添加了一个日期,它起作用了。但必须使日期成为可排序的格式。

     Text="{Binding Path=Date, Mode=OneWay, StringFormat={}{0:s}}"

答案 1 :(得分:0)

如果我理解得很好,我会使用Ticks的{​​{1}}属性进行排序,因为它的性质非常准确,而cource是一个简单的数字。

答案 2 :(得分:0)

你的ICollectionView是一个实例字段还是像你的codesnippet中的局部变量?

它必须是一个实例字段,然后排序才有效。顺便说一句,我尝试了你的片段,并将icollectionview更改为一个字段,它可以工作。

答案 3 :(得分:0)

如果您点击评论中发布的Siva链接并点击其中的其他链接,您最终会在http://connect.microsoft.com/VisualStudio/feedback/details/592897/collectionviewsource-sorting-only-the-first-time-it-is-bound-to-a-source处找到解决方法。这个解决方法是为DataGrid编写的,但您可以调整它以适应您正在使用的任何控件:

  

Greg Bachraty发表于2011年2月28日上午6:50

     

实现您自己的DataGrid:

public class SDataGrid : DataGrid
{
    static SDataGrid()
    {
        ItemsControl.ItemsSourceProperty.OverrideMetadata(typeof(SDataGrid), new FrameworkPropertyMetadata((PropertyChangedCallback)null, (CoerceValueCallback)null));
    }
}
  

当前实现中唯一强制回调的是   清除排序说明。您可以简单地“剪切”此代码   覆盖元数据。在Silverlight上不可行:OverrideMetadata API   不公开。虽然我不确定Silverlight会受此影响   错误。其他风险和副作用可能适用。