C# 如何在dataGrid中将XML中的数据作为数字进行排序

C# 如何在dataGrid中将XML中的数据作为数字进行排序,c#,xml,wpf,sorting,wpfdatagrid,C#,Xml,Wpf,Sorting,Wpfdatagrid,我有一个XML文件中的数据,显示在dataGrid中。(WPF,C#,VisualStudio 2013)其中一列是数字数据。当我对列进行排序时,它似乎将其转换为字母而不是数字,尽管我已尝试将该列指定为数字 dataGrid的XAML: <DataGrid ItemsSource="{Binding Path=Elements[Record]}" AutoGenerateColumns="False" Height="Auto" Name="dataGridRa

我有一个XML文件中的数据,显示在dataGrid中。(WPF,C#,VisualStudio 2013)其中一列是数字数据。当我对列进行排序时,它似乎将其转换为字母而不是数字,尽管我已尝试将该列指定为数字

dataGrid的XAML:

<DataGrid 
    ItemsSource="{Binding Path=Elements[Record]}"
    AutoGenerateColumns="False" Height="Auto" 
    Name="dataGridRank" 
    VerticalAlignment="Top" HorizontalAlignment="Stretch">

    <DataGrid.Columns>
        <DataGridTextColumn 
           Header="Name" 
           Width="*"
           Binding="{Binding Element[Name].Value}"/>
        <DataGridTextColumn 
           Header="Rank" 
           Width="*"
           Binding="{Binding Element[Rank].Value, StringFormat={}{0:N}}"/>
    </DataGrid.Columns>

</DataGrid>
当我点击列标题对排名进行排序时,我想要的是:

A 85

B 95

C 105

or 

C 105

B 95

A 85
我得到的是:

C 105

A 85

B 95

or 

B 95

A 85

C 105
无论是否使用Stringformat或dt:dt=“number”,我都尝试过,但都没有成功。我尝试了Stringformat=N以及Stringformat={}{0:N}


我错过了什么?这似乎应该很简单…

因为
元素值属性
的类型是
字符串
。因此列类型是字符串,因此这里使用字符串的默认比较器

StringFormat
在这里不起作用,因为它不会更改绑定属性的类型。它只是用于在GUI上格式化字符串

我建议在运行时创建匿名类型,并将其与
Rank
属性的
int
类型绑定,以便使用int的默认比较器

代码

var xml = XDocument.Load("database.xml").Root;
dataGridRank.ItemsSource = xml.Elements("Record")
                            .Select(e => new { Name = e.Element("Name").Value,
                             Rank = Convert.ToInt32(e.Element("Rank").Value) });
XAML:

    <DataGrid AutoGenerateColumns="False" Height="Auto" 
              Name="dataGridRank" 
              VerticalAlignment="Top" HorizontalAlignment="Stretch">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" 
                                Width="*"
                                Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Rank" 
                                Width="*"
                                Binding="{Binding Rank}"/>
        </DataGrid.Columns>

    </DataGrid>

var xml = XDocument.Load("database.xml").Root;
dataGridRank.ItemsSource = xml.Elements("Record")
                            .Select(e => new { Name = e.Element("Name").Value,
                             Rank = Convert.ToInt32(e.Element("Rank").Value) });
    <DataGrid AutoGenerateColumns="False" Height="Auto" 
              Name="dataGridRank" 
              VerticalAlignment="Top" HorizontalAlignment="Stretch">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" 
                                Width="*"
                                Binding="{Binding Name}"/>
            <DataGridTextColumn Header="Rank" 
                                Width="*"
                                Binding="{Binding Rank}"/>
        </DataGrid.Columns>

    </DataGrid>