[WPF DataGrid] Как сортировать реляционные данные в колонке
От: JuniorCSharper  
Дата: 30.03.11 14:24
Оценка:
Привет Всем профи WPF и просто программерам.

Не давно пользую WPF и столкнулся с такой задачей. Сам пробовал по разному... перерыл и RSDN и MSDN и google.
но ответа пока не нашел. Может кто посодействует
Есть база данных состоящая из двух связанных таблиц.
Их описание
Messages { *ID :int, Company: int, Message:string}
Companies { *ID:int, Name:string }
* — это поле образует первичный ключ, Есть join по полю Message.Company = Company.ID;

В WPF используется следующие CollectionViewSources
<Window x:Class="Window"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    >
    <Window.Resources>
            <CollectionViewSource x:Key="companiesViewSource"
                              Source="{Binding Path=Companies, Source={StaticResource mainDataSet}}" />
    </Window.Resources>
    <Grid DataContext="{StaticResource mainViewSource}">
        <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}"
                  Name="mainViewDataGrid"
                  IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="iDColumn" Binding="{Binding Path=ID}" Header="№ п/п"
                    Width="SizeToHeader" MinWidth="40" IsReadOnly="True"/>
                <DataGridComboBoxColumn x:Name="companyColumn" Header="Компания" Width="SizeToHeader"
                    ItemsSource="{Binding Source={StaticResource companiesViewSource}}"
                    SelectedValuePath="ID"
                    DisplayMemberPath="Name"
                    SelectedValueBinding="{Binding Path=Company}"
                    IsReadOnly="True" MinWidth="50"/>
                <DataGridTextColumn x:Name="messageColumn" Binding="{Binding Path=Message}"
                    Header="Сообщение" Width="SizeToHeader" IsReadOnly="True" MinWidth="50" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>


В файле App.xaml имеем следующие объявления
    <Application.Resources>
        <my:MainDataSet x:Key="mainDataSet" />
    </Application.Resources>


Все работает замечательно, за исключением сортировки по полю companyColumn. Тут сортировка идет не по символьному полю Companies.Name базы данных, а по числовому полю Messages.Company , что и не удивительно.
Как прикрутит правильную сортировку?

Спасибо за внимание и понимание
wpf datagrid database binding
Re: [WPF DataGrid] Как сортировать реляционные данные в коло
От: Osaka  
Дата: 30.03.11 14:58
Оценка:
JCS>правильную сортировку?
попробуй указать у колумна свойство SortMemberPath
Re[2]: [WPF DataGrid] Как сортировать реляционные данные в к
От: JuniorCSharper  
Дата: 30.03.11 15:12
Оценка:
Здравствуйте, Osaka, Вы писали:

JCS>>правильную сортировку?

O>попробуй указать у колумна свойство SortMemberPath

Пробовал.. Но самое умное что у меня получилось, это поставить сортировку по например полю
Messages.ID указав SortMemberPath="ID"

Если пробовал писать SortMemberPath="{Binding Source={StaticResource companiesViewSource}, Path=Name}"
то получем эксепшион при сортировке


System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical">
<TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier>
<Description>Unhandled exception</Description><AppDomain>Messages.vshost.exe</AppDomain>
<Exception><ExceptionType>System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>'Messages' type does not have property named '7Континент', so cannot sort data collection.</Message>
<StackTrace>   at System.Windows.Data.BindingListCollectionView.ConvertSortDescriptionCollection(SortDescriptionCollection sorts)
   at System.Windows.Data.BindingListCollectionView.RefreshOverride()
   at System.Windows.Data.CollectionView.RefreshOrDefer()
   at System.Windows.Data.BindingListCollectionView.SortDescriptionsChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.ComponentModel.SortDescriptionCollection.OnCollectionChanged(NotifyCollectionChangedAction action, Object item, Int32 index)
   at System.ComponentModel.SortDescriptionCollection.InsertItem(Int32 index, SortDescription item)
   at System.Windows.Data.BindingListCollectionView.BindingListSortDescriptionCollection.InsertItem(Int32 index, SortDescription item)

где '7Континент' -одно из значений поля Companies.Name

А как Добраться до сторки ... Видно не могу найти что и где почитать
Re[3]: [WPF DataGrid] Как сортировать реляционные данные в к
От: Osaka  
Дата: 30.03.11 15:21
Оценка:
принцип такой, что в том объекте на который забиндена строка грида, должны быть свойства наподобие:

CompanyID (например Guid)
и
Company (сущность с атрибутами)

тогда сам comboboxcolumn можно привязать к CompanyID, а сортировку к "Company.Name"
Не помню генерятся ли в датасетах навигационные свойства (такие как в примере выше Company),
если нет то доделать их в partial классе у типизированного DataRow

можно проще, вынести в тот запрос к результату которого приделывается грид поля CompanyID (Guid) и CompanyName (string), сортировать по 2му
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.