2017-02-21 36 views
1

Я ищу (предпочтительно XAML) решение для автоматической сортировки WPF DataGrid столбцом, который отображает значения даты в формате dd.MM.yyyy. DataGrid s ItemSource - это DataTable, который считывается из XML-строки.Wpf DataGrid (немецкий) Дата Сортировка

Код, который у меня уже есть, кажется, не работает, однако, если я установил, например. SortDirection = "Ascending" в столбце, который отображает ints, он работает. Я оставил все в кодексе, что не имеет отношения к моему вопросу.

Надеюсь, вы можете мне помочь, спасибо заранее.

<DataGrid IsReadOnly="True" 
      ItemsSource="{Binding Path=MyDataTable}" 
      AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Date" Binding="{Binding Date, StringFormat='{}{0:dd.MM.yyyy}'}" SortDirection="Ascending"/> 
    </DataGrid.Columns> 
</DataGrid> 

Edit:

DataTable десериализируется по методу DataTable.ReadFromXml() из следующей строки:

<DataTable 
    xmlns=\"http://schemas.datacontract.org/2004/07/System.Data\"> 
    <xs:schema id=\"NewDataSet\" 
     xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" 
     xmlns=\"\" 
     xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\"> 
     <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"ResultTable\" msdata:UseCurrentLocale=\"true\"> 
      <xs:complexType> 
       <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\"> 
        <xs:element name=\"ResultTable\"> 
         <xs:complexType> 
          <xs:sequence> 
           <xs:element name=\"Date\" type=\"xs:dateTime\" minOccurs=\"0\"/> 
          </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
       </xs:choice> 
      </xs:complexType> 
     </xs:element> 
    </xs:schema> 
    <diffgr:diffgram 
     xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\" 
     xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\"> 
     <DocumentElement 
      xmlns=\"\"> 
      <ResultTable diffgr:id=\"ResultTable1\" msdata:rowOrder=\"0\"> 
       <Date>2017-03-11T00:00:00+01:00</Date> 
      </ResultTable> 
      <ResultTable diffgr:id=\"ResultTable2\" msdata:rowOrder=\"0\"> 
       <Date>2017-22-11T00:00:00+01:00</Date> 
      </ResultTable> 
      <ResultTable diffgr:id=\"ResultTable3\" msdata:rowOrder=\"0\"> 
       <Date>2017-03-11T00:00:00+01:00</Date> 
      </ResultTable> 
     </DocumentElement> 
    </diffgr:diffgram> 
</DataTable> 

Edit # 2:

Вместо того, чтобы пытаться найти (по-видимому, довольно сложно) Решение Xaml-Only, теперь я сортирую DataTable непосредственно в MySQL, откуда я его извлекаю. Это является более простым и быстрым решением.

+0

Должен ли пользователь иметь возможность сортировать столбцы, нажимая на них или вы можете просто сортировать код позади? – apc

+0

После большего изучения я думаю, что это, вероятно, из-за строкового формата в привязке, заставляющего его сортировать как результирующую строку. Можете ли вы попробовать использовать формат yyyy-MM-dd, чтобы узнать, работает ли это. – apc

+0

Является ли 'Date' DateTime или строкой? IIRC, столбец DateTime по умолчанию сортируется по базовому дате DateTime, а не по отображаемым данным. – Kilazur

ответ

2

Вместо привязки к DataView вы могли связываться с CollectionViewSource, что сортирует мнение по Date собственности по умолчанию:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="300" Width="300"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="cvs" Source="{Binding MyDataTable}"> 
      <CollectionViewSource.SortDescriptions> 
       <scm:SortDescription PropertyName="Date" Direction="Ascending" /> 
      </CollectionViewSource.SortDescriptions> 
     </CollectionViewSource> 
    </Window.Resources> 
    <Grid> 
     <DataGrid IsReadOnly="True" 
      ItemsSource="{Binding Source={StaticResource cvs}}" 
      AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Date" Binding="{Binding Date, StringFormat='{}{0:dd.MM.yyyy}'}" /> 
      </DataGrid.Columns> 
     </DataGrid>   
    </Grid> 
</Window> 
+0

прежде всего, спасибо за ваш ответ. Я пробовал, но, к сожалению, это не работает. У вас есть идея, почему это не сработает? Также я не привязываюсь к DataView, а скорее к DataTable. Я не знаю, если это имеет значение. –

+0

Не могли бы вы предоставить некоторые примеры данных, которые могут быть использованы для воспроизведения вашей проблемы ?: http://stackoverflow.com/help/mcve. Убедитесь, что свойство Date возвращает ожидаемое значение. – mm8

+0

это точное значение (взято из Отладчика), которое имеет конкретный столбец: '11.03.2017 00: 00: 00' –

2

Вы можете использовать SortMemberPath на столбце, чтобы определить, какое имущество должно использоваться для сортировки ,

+0

спасибо за ваше предложение, я еще не пробовал, так как решил эту проблему, сортируя данные, когда получаю (в MySQL). Но я ценю ваш ответ и скоро попытаюсь –

 Смежные вопросы

  • Нет связанных вопросов^_^