Привет Всем профи 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 , что и не удивительно.
Как прикрутит
правильную сортировку?
Спасибо за внимание и понимание
Здравствуйте, 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
А как Добраться до сторки ... Видно не могу найти что и где почитать
принцип такой, что в том объекте на который забиндена строка грида, должны быть свойства наподобие:
CompanyID (например Guid)
и
Company (сущность с атрибутами)
тогда сам comboboxcolumn можно привязать к CompanyID, а сортировку к "Company.Name"
Не помню генерятся ли в датасетах навигационные свойства (такие как в примере выше Company),
если нет то доделать их в partial классе у типизированного DataRow
можно проще, вынести в тот запрос к результату которого приделывается грид поля CompanyID (Guid) и CompanyName (string), сортировать по 2му