【问题标题】:Sort List with Databinding Windows Universal C#使用数据绑定 Windows 通用 C# 排序列表
【发布时间】:2015-08-07 04:03:40
【问题描述】:

我通过发送 httprequest 并检索 json 格式的文本来获得一个列表。我创建了这个列表:

<ListBox Background="Red" ItemsSource="{Binding}" x:Name="Itemlist">
    <ListBox.ItemTemplate>
        <DataTemplate>
             <StackPanel Orientation="Horizontal">
                 <TextBlock Text="{Binding Price}"></TextBlock>
                 <TextBlock Text="{Binding InventoryItem.properties.name}" Foreground="Green"></TextBlock>
             </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

现在我想对这个列表进行排序。价格最高的 Listitems 应该是第一个。我该怎么做?

【问题讨论】:

  • @Aron 不,我已经检查过了,我对如何在 c# 中订购列表感兴趣。
  • 您可以对列表进行排序。但是,这不会对您的 UI 产生任何影响,具体取决于您对列表进行排序的时间。
  • 确实如此,因为我绑定到 null 然后我将它重新绑定到我的列表。那么我该如何排序呢? @Aron
  • 我建议不要这样做,因为它会导致整个 ListBox 重新绑定,这意味着您将丢失所有 UI 状态,并且 UI 必须重新生成所有 UI 元素。但是,如果您必须这样做,请使用Foo = Foo.OrderBy(x =&gt; x.Price).ToList();。但是,它仍然不起作用,除非您将您的财产连接为 INPC 财产。

标签: c# windows list xaml universal


【解决方案1】:

我在列表中调用 .sort() 函数:

  test.Items.Sort();

 public class Item:IComparable<Item>
    {
        public InventoryItem InventoryItem { get; set; }
        public double Price { get; set; }

        public int CompareTo(Item other)
        {
            return this.Price.CompareTo(other.Price);
        }

【讨论】:

    【解决方案2】:

    您需要创建一种从 ObservableCollection 继承的新列表:

    public class MyItemsList:ObservableCollection<Item>
    {
    }
    

    完成此操作后,您可以按照@matthias Herrmann 向您展示的模式订购列表。

    MyItemsListInstance.Items.Sort();
    
     public class Item:IComparable<Item>
        {
            public InventoryItem InventoryItem { get; set; }
            public double Price { get; set; }
    
            public int CompareTo(Item other)
            {
                return this.Price.CompareTo(other.Price);
            }
    

    鉴于您现在将 List 实现为 ObservableCollection,对 列表结构 的任何更改都会引发通知以自动刷新视图 (UI)。

    【讨论】:

      【解决方案3】:

      我假设您将 ItemList ListBox 绑定到 属性? (在示例中命名为 ItemList)

      在属性的getter中,可以添加自定义transform,对从源列表对象传过来的数据进行排序。

      例如。

      private List<Item> itemList = ///etc.
      
      public List<Item> ItemList //binding to this
      {
          public get { return itemList.OrderByDescending(x => x.price).ToList(); }
      }
      

      【讨论】:

      • -1 这是一段非常糟糕的代码,我不知道从哪里开始。 OrderByDescending 返回 IEnumerable&lt;T&gt; 而不是 List&lt;T&gt;。这将强制每次加载显示时对列表进行排序。它不会监听添加到列表中的新对象...我可以继续打开。
      • 这是一个示例,说明如何在 getter 中进行转换,当然,您无论如何都希望使用 IObservable 而不是简单的列表,但作为一个基本示例,它可以工作。 OP 需要将这个概念应用于他们已经完成的代码。但是,是的,我同意你的观点,这是一个糟糕的答案。
      • 除了最基本的转换或可能在 getter 中缓存的转换之外的任何东西都会产生意想不到的结果。在这里,您有一个惰性求值转换,它需要大量资源才能完成。
      • @Aron 你能帮帮我吗?
      猜你喜欢
      • 2020-10-07
      • 2016-09-23
      • 2011-01-17
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多