WPF DataGrid Melhores Práticas?
-
10-07-2019 - |
Pergunta
Eu estou trabalhando em um aplicativo WPF baseados em MVVM que usa o DataGrid
. A grade é de dados vinculado a um ObservableCollection<Widget>
(a lista Widget
). O usuário precisa ser capaz de inserir um Widget
na lista abaixo do Widget
atualmente selecionado, para apagar um Widget
selecionado, e para reordenar os Widget
s no grid. Eu vou implementar a reordenação através de arrastar e soltar.
Antes que eu cavar isso, eu quero começar uma verificação da realidade sobre a minha abordagem. Aqui está o que estou planejando fazer: A classe Widget
terá uma propriedade Index
que será usado para ordenar a lista Widget
. Adições, exclusões e reordenamento será feito através da manipulação esta propriedade Index, ea triagem será feita na lista Widget
, em vez de através de um CollectionView
.
Antes do DataContext
está definido, a lista Widget
serão classificados na propriedade Index
. Quando um usuário adiciona um Widget
, a propriedade Index
será incrementado em 1 para cada Widget
abaixo do item selecionado no grid, eo novo Widget
será dado o número de índice aberto pela renumeração. A lista Widget
vai recorreram, e as ligações serão atualizados.
Quando um usuário exclui uma Widget
, o Widget
será removido da lista, ea propriedade Index
de itens na grade abaixo do item excluído será diminuída por 1. A lista Widget
será recorreu, e as ligações atualizados, como acima. Reordenamento será feito como uma combinação de exclusão-and-insert.
Aqui está a minha pergunta: Será esta uma estratégia razoável para a implementação de inserção, exclusão e reordenação? Existe uma maneira melhor de fazer isso? Qualquer bons artigos ou posts sobre o assunto? Eu olhei, mas eu não estou chegando com qualquer coisa on-ponto.
Obrigado por sua ajuda.
Solução
Eu tenho este problema descoberto. Eu preciso a propriedade Index, mas eu não preciso de classificar o ObservableCollection. I criar uma interface, IIndexedObject, com uma propriedade, Index. Eu implementar essa interface em qualquer objeto que precisa ser indexado, e na minha tabela de banco, eu adicionar uma coluna de índice.
Quando eu carregar no meu modelo de objeto, eu classificar a tabela de banco de dados sobre a propriedade Index. Isso garante que a lista é carregado na mesma ordem como na última corrida. Eu adicionar objetos usando a linha em branco fornecido na parte inferior do DataGrid. Dá-lhes um índice de 0. Eu objetos de exclusão usando um botão Delete vinculado a um ICommand no modelo de vista.
Meu modelo de vista subscreve a propriedade CollectionChanged de qualquer ObservableCollection que contém IIndexedObjects. Quando o evento é acionado, o modelo de vista passa a coleção para um método de serviço ReIndexCollection, que leva uma IIndexedObject. O método de re-índices da coleção, com base em sua ordem atual, simplesmente repetindo a coleção, a atribuição de um valor inteiro incremental para Index propriedade de cada elemento. Quando eu persistem as costas coleção para o banco de dados, o valor do índice é salvo, para garantir que a coleção é carregado na mesma ordem na próxima execução.
Uma vez que a única classificação que é necessário é feito na carga de banco de dados, não há necessidade de classificar o ObservableCollection. Quando eu mover itens no DataGrid, ele vai cuidar de reordenação da coleção na época. Tudo o que tenho a fazer é re-indexar a coleção, de modo que seu pedido será persistido de volta para o banco de dados.
All-in-tudo, é muito mais fácil do que eu esperava. Uma das razões I como WPF e MVVM.
Outras dicas
Como melhorar o desempenho de classificação: http: //blogs.msdn.com/jgoldb/archive/2008/10/30/improving-microsoft-datagrid-sorting-performance-part-3.aspx