WPF Datagrid сортировка по привязке столбца к XML, содержащему числа - PullRequest
1 голос
/ 07 июля 2010

Я связываю свой WPF Datagrid с источником XML.У меня есть столбец DataGridTextColumn, представляющий идентификатор моего объекта.Когда я сортирую по этому столбцу, он дает мне, например: 1, 12, 13, 2, 3, 31, 4.

Я, очевидно, хотел бы отсортировать его как 1, 2, 3, 4, 12, 13, 31.

Есть ли способ указать, что я хочу отсортировать столбец на основе целочисленного представления строки?

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 января 2011

Отличный ответ и ссылка.

Однако, если вы пытаетесь отсортировать WPF DataGrid, связанный с 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));
1 голос
/ 08 июля 2010

Вам нужно будет выполнить сортировку самостоятельно.Вы можете использовать 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;
    }
}
...