c# - 如何在 dataGrid 中将 XML 中的数据排序为数字

标签 c# xml wpf sorting wpfdatagrid

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

数据网格的 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>

XML 文件“ranks.xml”:

<Ranks xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <Record>
     <Name> A </Name>
     <Rank dt:dt="number"> 85 </Rank>
  </Record>
  <Record> 
    <Name> C </Name>
    <Rank dt:dt="number"> 105 </Rank>
  </Record>
  <Record>
    <Name> B </Name>
    <Rank dt:dt="number"> 95</Rank>
  </Record>
</Ranks>

加载 xml 文件的 C# 代码:

var xml = XDocument.Load("Resources/ranks.xml").Root;
dataGridRanks.DataContext = xml;

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

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 在这里不起作用,因为它不会更改绑定(bind)属性的类型。它仅用于在 GUI 上格式化字符串。

我建议在运行时创建匿名类型,并将其与 Rank 属性的 int 类型绑定(bind),以便使用 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>

关于c# - 如何在 dataGrid 中将 XML 中的数据排序为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21687407/

相关文章:

c# - WPF ListView/GridView 绑定(bind)

c# - 将 System.DayOfWeek 转换为 Microsoft.Office.Interop.Outlook.OlDaysOfWeek

Javascript - 表单上的原型(prototype) : Event. 观察不适用于 IE

c# - purecss.io 并包装一个 LabelFor

java - 我可以使用 xml 连接 spring @stereotype bean吗

Go 中的 XML 解码给出带有导出字段的空结果

wpf - 为什么在某些控件的主题设置方面 Windows 8 的行为与 Windows 7 不同?

c# - 如何将 ComboBox 绑定(bind)到一列列表

c# - 如何将负字符串转换为十进制值?

c# - 通过经典 ASP 的 COM Interop(如何将数组传递给 com)