我将我的WPF Datagrid绑定到XML源。我有一个DataGridTextColumn
列代表我的对象的Id。当我对该列进行排序时,它给出了例如:1,12,13,2,3,31,4。
我显然想把它分类为1,2,3,4,12,13,31。
有没有办法指定我想根据字符串的整数表示形式对列进行排序?
感谢。
答案 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));