WPF ListView - Classificação por propriedades aninhadas
-
19-09-2019 - |
Pergunta
Recentemente, tropecei em um problema em que o WPF ListView
O controle parece estar restringindo a capacidade de classificar seus itens. Especificamente, estou tendo muitos problemas para tentar obter um SortDescription
reconhecer propriedades aninhadas (propriedades das propriedades).
Para classificação direta por propriedades, a linha a seguir deve fazer o trabalho:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty",
ListSortDirection.Ascending));
E de fato funciona bem para mim. No entanto, porque o ItemSource
para o meu ListView
é um (fortemente tibra) DataTable
, algumas das colunas estão vinculadas a propriedades aninhadas da linha (ou seja, Row.OtherTableRow.SubProperty
Estilo do caminho de ligação) - é a maneira como os conjuntos de dados ADO.NET funcionam para bancos de dados hierarquiais.
O que eu gostaria de fazer é algo assim:
listView.Items.SortDescriptions.Add(new SortDescription("MyProperty.SubProperty",
ListSortDirection.Ascending));
Mas infelizmente essa linha joga um ArgumentException
:
O tipo de 'pedidos' não possui propriedade denominada 'linha. [Id]', portanto, não pode classificar a coleta de dados.
Estranhamente, não tenho nenhum problema em vincular a propriedades aninhadas. De fato, os campos aparecem perfeitamente bem no ListView
... nem adicionar um PropertyGroupDescription
para listView.GroupDescriptions
me dê algum problema com propriedades aninhadas - é apenas SortDescriptions
!
É isso apenas uma limitação de wpf/o ListView
ao controle? Existe alguma maneira de obter apoio como parte da estrutura ou ficarei sem sorte lá? Se eu infelizmente sou, e essa inconsistência é inevitável, eu apreciaria muito se alguém pudesse sugerir um hack ou solução alternativa para esse cenário de propriedades aninhadas. Eu já tentei algumas idéias, mas tudo com um sucesso mínimo.
Nota: percebo que um ORM pode resolver meus problemas, mas receio que isso não seja viável para o projeto atual em que estou trabalhando. Os conjuntos de dados simples do ADO.NET terão que fazer.
Solução
De acordo com a Windows Apresentation Foundation Unnized (Adam Nathan), você pode lançar a visualização padrão em uma ListCollectionView e definir uma implementação personalizada do ICOMPARER em sua propriedade Alfabaramente.