【问题标题】:Reverse order of ObservableCollectionObservableCollection 的逆序
【发布时间】:2012-05-02 12:14:34
【问题描述】:

我有包含自定义对象的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 有问题还是有更好的处理方法?

【问题讨论】:

  • 您是按时间顺序按升序还是降序排序?
  • 降序如代码示例所示。但它并没有给出稳定的结果。首先它以正确的顺序添加,然后在 3 个按钮之后它开始添加完全错误的项目。
  • 尝试使用Insert() 方法而不是Add() 并在索引0 处添加新项目怎么样?
  • 我不能这样做,因为我的计算取决于项目的顺序(在我的问题中以粗体显示)。

标签: c# wpf observablecollection


【解决方案1】:

您会尝试在 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}}"

【讨论】:

  • 想详细说明一下索引是什么意思?将考虑在 xaml 中尝试它,谢谢。我也尝试按标题排序。因为创建的每个按钮都有一个唯一的标题(btn1、2、3 等)。即使在进行排序时,我也无法获得正确的排序顺序。问候。
  • xaml 似乎不起作用,它只是添加到右侧,根本没有发生任何排序。
  • 查看更新以回答。我只能说它对我有用。如果排序根本不适合您,那么我认为您需要将其分解为一个简单的文本 ListBox 进行排序并开始添加更改以查看其中断的位置。
  • 我只是不知道。它在一个相当复杂的页面上对我有用。就像我说的打破它。我在一个对象上使用它并且它正在工作。它不是按钮,但不应破坏它。是否调用了 Date Get?而且我认为我的在 StringFormat={}{0:s} 之前工作,但很难看到。
  • 使它与使标题成为唯一整数值​​一起工作,不太确定为什么我的日期无法开始排序。顺便说一句,你会把那个文本放在哪里?谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您的 ICollectionView 是实例字段还是像您的代码 n-p 中的局部变量?

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

    【讨论】:

      【解决方案4】:

      如果您点击 Siva 在 cmets 中发布的链接并从那里点击另一个链接,您最终会到达 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 是否受此影响 漏洞。可能存在其他风险和副作用。

      【讨论】:

      • Robert ListBox 没有 cachedItemsSource?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多