2010-07-07 128 views
1

我将我的WPF Datagrid绑定到XML源。我有一个DataGridTextColumn列代表我的对象的Id。当我在那一栏上排序时,它给了我例如:1,12,13,2,3,31,4 4.WPF Datagrid在列上排序绑定到包含数字的XML

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

有没有一种方法来指定我想根据字符串的整数表示对列进行排序?

谢谢。

回答

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

谢谢,我也发现这样做的另一种方式:http://blogs.msdn.com/b/jgoldb/archive/2008/08/26/improving-microsoft-数据网格-CTP-分拣performance.aspx – joerage 2010-07-12 18:16:48

1

大答案和纽带。

但是,如果您尝试对与DataTable绑定的WPF 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));