代码之家  ›  专栏  ›  技术社区  ›  joerage

wpfdatagrid对绑定到包含数字的XML的列进行排序

  •  1
  • joerage  · 技术社区  · 15 年前

    DataGridTextColumn 表示对象Id的列。当我对该列排序时,它会给出例如:1,12,13,2,3,31,4。

    有没有办法指定我要根据字符串的整数表示对列进行排序?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Wallstreet Programmer    15 年前

    你需要自己分类。您可以使用linq轻松地对xml进行排序。下面的示例在单击标题时按预期对数字进行排序。我只执行升序排序。

    XAML编号:

    <Window x:Class="DataGridDemo.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
        Height="300" Width="300">
        <StackPanel>
            <Controls:DataGrid 
                ItemsSource="{Binding Path=Trades}"
                Sorting="OnSorting">
                <Controls:DataGrid.Columns>
                    <Controls:DataGridTextColumn Header="Side" Binding="{Binding Path=Attribute[Side].Value}" />
                    <Controls:DataGridTextColumn Header="Price" Binding="{Binding Path=Attribute[Price].Value}" />
                    <Controls:DataGridTextColumn Header="Volume" Binding="{Binding Path=Attribute[Volume].Value}" />
                </Controls:DataGrid.Columns>
            </Controls:DataGrid>
        </StackPanel>
    </Window>
    

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Windows;
    using System.Xml.Linq;
    using Microsoft.Windows.Controls;
    
    namespace DataGridDemo
    {
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
    
                DataContext = new VM();
            }
    
            private void OnSorting(object sender, DataGridSortingEventArgs e)
            {
                e.Handled = true;
    
                (DataContext as VM).SortCol = e.Column.Header as string;
            }
        }
    
        public class VM : INotifyPropertyChanged
        {
            public VM()
            {
                _data = 
                    new XElement("Trades",
                                 new XElement("Trade", new XAttribute("Side", "Buy"), new XAttribute("Price", "3.23"), new XAttribute("Volume", "100")),
                                 new XElement("Trade", new XAttribute("Side", "Sell"), new XAttribute("Price", "13.12"), new XAttribute("Volume", "200")),
                                 new XElement("Trade", new XAttribute("Side", "Buy"), new XAttribute("Price", "04.1"), new XAttribute("Volume", "15")),
                                 new XElement("Trade", new XAttribute("Side", "Buy"), new XAttribute("Price", "30.78"), new XAttribute("Volume", "120")));
    
                SortCol = "Price";
            }
    
            private string _sortCol;
            public string SortCol
            {
                get { return _sortCol; }
                set
                {
                    _sortCol = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs(""));
                    }
                }
            }
    
            public IEnumerable<XElement> Trades
            {
                get
                {
                    if (SortCol == "Side")
                    {
                        return from trade in _data.Elements("Trade")
                            orderby (string)trade.Attribute(SortCol)
                            select trade;
                    }
    
                    return
                        from trade in _data.Elements("Trade")
                        orderby (double)trade.Attribute(SortCol)
                        select trade;
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private XElement _data;
        }
    }
    
        2
  •  1
  •   JohnB    14 年前

    很好的答案和链接。

    DataGrid DataTable ,你只需要确保 具有适当定义的列类型。

    例如:

    DataTable dt = new DataTable("cats");
    dt.Columns.Add("id", typeof(int)); // DataGrid will sort on this column correctly
    dt.Add("name", typeof(String));
    dt.Add("price", typeof(decimal));