列上的WPF Datagrid排序绑定到包含数字的XML

时间:2010-07-07 17:45:08

标签: wpf sorting wpfdatagrid

我将我的WPF Datagrid绑定到XML源。我有一个DataGridTextColumn列代表我的对象的Id。当我对该列进行排序时,它给出了例如:1,12,13,2,3,31,4。

我显然想把它分类为1,2,3,4,12,13,31。

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

感谢。

2 个答案:

答案 0 :(得分:1)

您需要自己进行排序。您可以使用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;
    }
}

答案 1 :(得分:1)

很棒的答案和链接。

但是,如果您尝试对绑定到DataGrid的WPF DataTable进行排序,则只需确保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));