ObservableCollection的反向顺序

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

我在找什么:

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

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

问题:

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

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

例如:

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

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

CollectionViewSource有问题还是有更好的方法来处理它?

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

         

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

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

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

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

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

它必须是一个实例字段,然后您的排序将起作用。 顺便说一句,我尝试了你的片段,并将icollectionview更改为一个字段,它的工作原理。

如果您按照评论中发布的Siva链接并按照其中的其他链接进行操作,您最终将最终访问http://connect.microsoft.com/VisualStudio/feedback/details/592897/collectionviewsource-sorting-only-the-有人发布了一个解决方法, 它是第一次被绑定到源头 。 此解决方法是为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会受到这个bug的影响。 其他风险和副作用可能适用。