Cancelar Remover Ação - NotifyCollectionChangedAction
-
26-09-2019 - |
Pergunta
Estou usando o seguinte código no meu ViewModel para excluir itens de uma coleção:
UnitMeasureCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(ListOfUnitMeasureCollectionChanged);
void ListOfUnitMeasureCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Remove)
{
if (NavigationActions.DeleteConfirmation("Delete Item.", "Are you sure you want to delete this item? This action cannot be undone."))
{
foreach (UnitMeasureBO item in e.OldItems)
{
UnitMeasureBO unitMeasureBO = item as UnitMeasureBO;
bool inUse = unitMeasureRepository.UnitMeasureInUse(unitMeasureBO.UnitMeasureValue);
if (inUse == true)
{
NavigationActions.ShowError("Cannot delete item", "This item cannot be deleted because it is used elsewhere in the application.");
}
else
{
unitMeasureRepository.DeleteUnitMeasure(unitMeasureBO.UnitMeasureValue);
}
}
}
}
}
Eu tenho um datagrid que está vinculado à coleção. Gostaria de saber se há de alguma maneira de cancelar a ação de remover com base no prompt de confirmação? Percebi que o notifyCollectionChangedEventArgs não possui um método de cancelamento. O que acontece é quando um usuário exclui um item do DataGrid, mas escolhe 'não' na confirmação, o item ainda é removido do DataGrid. Ele não é excluído do banco de dados e, se o datagrid estiver atualizado, ele aparecerá novamente. Estou usando o padrão MVVM e prefiro fazer isso sem precisar codificar meu datagrid. Qualquer ajuda é apreciada.
Solução
Bem, você não pode cancelar uma ação de remover durante um evento de coleta.
Minha sugestão: se você estiver usando o MVVM, deve ter um deleteCommand em algum lugar que seja acionado quando o DeleteKey é pressionado no datagrid. No método Execute () deste comando, você deve:
- Pergunte a confirmação.
- Se o usuário escolher sim, remova o item da coleção. Essa remoção deve ser refletida diretamente no datagrid.
- Se o usuário não escolher, não faça nada.
Isso significa, porém, que o DataGrid.CanuserDeleterows está definido como falso, pois você basicamente precisa controlar quando as linhas são excluídas.
Espero que isto ajude.