【问题标题】:How to sort data from XML as numeric in a dataGrid如何将 XML 中的数据排序为 dataGrid 中的数字
【发布时间】:2014-03-08 09:16:24
【问题描述】:

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

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

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

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}。

我错过了什么?看来这应该很简单……

【问题讨论】:

    标签: c# xml wpf sorting wpfdatagrid


    【解决方案1】:

    因为Element value attributestring 类型。所以列类型是字符串,因此 这里使用的是字符串的默认比较器

    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>
    

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 2013-03-03
      • 2017-03-04
      相关资源
      最近更新 更多