Implementando uma “Fábrica” própria para reutilizar Exibições no WPF

Atualmente estou usandoWAF (WPF Application Framework) para programação em WPF. Eu realmente gosto da idéia de ter um ViewModel próprio para cada pequena unidade de exibição no meu aplicativo que eu implementei posteriormente dessa maneira.

No meu projeto, recebi uma lista complexa na qual cada elemento da lista também contém uma lista. Cada elemento de lista e lista de lista é um ViewModel próprio devido à complexidade. O cenário "pior dos casos" contém de 60 a 90 modelos de exibição no total, apenas para a exibição em lista.

(É uma lista de perguntas em que cada pergunta tem uma lista de respostas com classificações e outros elementos da interface do usuário).

Essa implementação funciona muito bem, mas o desempenho é bastante ruim. Após a criação de perfil, descobri que o erro resulta na criação de meus ViewModels quando alterno entre um conjunto de perguntas (porque toda a lista precisa ser gerada novamente).

Quando alterno entre os conjuntos de perguntas, não posso reutilizar minhas visualizações 1: 1, pois não há o mesmo número de perguntas.

No entanto, achei que poderia reutilizar os modelos de exibição fornecidos e adicionar (caso o novo conjunto exija mais visualizações) mais modelos de visualização, se necessário.

Portanto, eu escrevi a seguinte fábrica:

[Export]
public class ViewModelPerformanceFactory<T> where T : IPerformanceFactoryViewModel
{
    private List<T> _collection;
    private int _index;
    private readonly ExportFactory<T> _exportFactory;

    [ImportingConstructor]
    public ViewModelPerformanceFactory(ExportFactory<T> exportFactory)
    {
        _exportFactory = exportFactory;
        _index = 0;
    }

    public void Reset()
    {
        _index = 0;
        if (_collection == null)
        {
            return;
        }
        foreach (var elem in _collection)
        {
            elem.Reset();
        }
    }

    public T Get()
    {
        if (_collection == null)
        {
            _collection = new List<T>();
        }
        if (_collection.Count <= _index)
        {
            _collection.Add(_exportFactory.CreateExport().Value);
        }
        return _collection[_index++];
    }
}

OndeIPerformanceViewModel apenas oferece umaReset-Método para limpar o ViewModel e o View.

Portanto, toda vez que um novo conjunto de perguntas é carregado, chamo a função de redefinição do meu ViewModelPerformanceFactory, que limpa todos os modelos e configura o índice de volta para 0 (por isso, se alguém exigir uma nova instância do viewmodel, ela criará a primeira) .

Em teoria, isso funciona muito bem.

Agora, para minha pergunta / problema: quanto mais vezes alterno entre meus conjuntos de perguntas, mais lento é o meu aplicativo ... Não é o carregamento dos objetos viewmodel - tudo bem. Minha lista parece muito muito lenta - às vezes até fica presa por alguns segundos e continua a aumentar ...

Eu acho que esse é um problema WAF, pois todo o ViewModel instancia um View, veja:

protected ViewModel(TView view) : base(view)
    {
        this.view = view;
    }
}

e parece que não consigo reutilizar visualizações tão fáceis quanto os modelos da WAF.

Alguém tem uma sugestão para mim ou talvez outra abordagem para acelerar meu aplicativo? Ou alguém acha que toda a minha abordagem é estúpida e eu calei a programação? ;)

Edit: Parece haver um vazamento de memória / desempenho às vezes, mas não é reproduzível todas as vezes .. :(

questionAnswers(3)

yourAnswerToTheQuestion