2

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

我在找什么:

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

ObservableColection包含 Button 对象(自定义样式)。这些按钮以水平布局显示在 aListBox和 a 内StackPanel(因此这些按钮可以很好地相互放置)。

问题:

创建的每个按钮都会收到一个DateTime. 新添加的按钮的日期总是比之前的按钮更新。对此的所有计算都在计时器内进行(目前每秒运行一次)。

所以我这次基本上是在排序,但是在像 3 个按钮之后突然一个按钮被放置在右侧(而不是左侧)。

例如:

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

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

有什么问题CollectionViewSource还是有更好的方法来处理这个问题?

4

4 回答 4

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}}"
于 2012-05-02T13:09:15.450 回答
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 是否受此错误的影响。其他风险和副作用可能适用。

于 2012-05-02T13:19:47.263 回答
0

如果我理解得很好,我会使用 to sort 的Ticks属性,DateTime因为它本质上非常准确,而且当然是一个简单的数字。

于 2012-05-02T12:31:41.080 回答
0

您的 ICollectionView 是实例字段还是代码片段中的局部变量?

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

于 2012-05-02T12:32:28.977 回答