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 Widgets 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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top