O agrupamento / filtro de itens deve estar na camada ViewModel ou View?

5

Estou em uma situação em que tenho uma lista de itens que precisam ser exibidos, dependendo de suas propriedades. O que eu não tenho certeza é onde é o melhor lugar para colocar a lógica de filtragem / agrupamento do estado do viewmodel?

Atualmente eu tenho isso na minha opinião usando conversores, mas não tenho certeza se eu deveria ter a lógica no viewmodel?

por exemplo,

Camada ViewModel:

class ItemViewModel
{
    DateTime LastAccessed { get; set; }
    bool IsActive { get; set; }
}

class ContainerViewModel
{
     ObservableCollection<Item> Items {get; set;}
}

Visualizar camada:

<TextView Text="Active Items"/>
<List ItemsSource={Binding Items, Converter=GroupActiveItemsByDay}/>
<TextView Text="Active Items"/>
<List ItemsSource={Binding Items, Converter=GroupInActiveItemsByDay}/>

ou devo construí-lo assim?

Camada ViewModel:

class ContainerViewModel
{
   ObservableCollection<IGrouping<string, Item>> ActiveItemsByGroup {get; set;}
   ObservableCollection<IGrouping<string, Item>> InActiveItemsByGroup {get; set;}
}

Visualizar camada:

<TextView Text="Active Items"/>
<List ItemsSource={Binding ActiveItemsGroupByDate }/>
<TextView Text="Active Items"/>
<List ItemsSource={Binding InActiveItemsGroupByDate }/>

Ou talvez algo entre?

Camada ViewModel:

class ContainerViewModel
{
   ObservableCollection<IGrouping<string, Item>> ActiveItems {get; set;}
   ObservableCollection<IGrouping<string, Item>> InActiveItems {get; set;}
}

Visualizar camada:

<TextView Text="Active Items"/>
<List ItemsSource={Binding ActiveItems, Converter=GroupByDate }/>
<TextView Text="Active Items"/>
<List ItemsSource={Binding InActiveItems, Converter=GroupByDate }/>

Eu acho que minha pergunta é o que é uma boa prática em termos de qual lógica colocar no ViewModel e que lógica colocar na Binding na View, já que eles parecem se sobrepor um pouco?

    
por ronag 02.08.2013 / 16:08
fonte

2 respostas

3

Agrupar e filtrar é um dos propósitos explícitos de um Modelo Visualizar , ao invés de apenas usar um Modelo . O modelo de vista pega os dados do modelo e os organiza precisamente para a vista dada.

Isso significa que, onde um modelo pode frequentemente ser uma representação de dados robusta e a visualização precisa apenas de uma subseção ou agregação desse modelo, o modelo de exibição existe para fornecer os dados que sua visualização precisa para que sua visualização não precise ser feita aquele trabalho de perna.

Pode ser confuso, porque muitas vezes as pessoas escrevem código que tem a visão indo direto para o modelo e, nesses casos, a visualização acaba sendo responsável por esse trabalho, mas se você usar modelos de visualização como intermediários, precisa e não deve estar fazendo este trabalho não-apresentacional na visão.

    
por 02.08.2013 / 17:05
fonte
1

Não sei se há uma única resposta correta aqui, mas prefiro fazer o agrupamento no XAML usando um CollectionViewSource onde eu posso. Por exemplo, algo como o seguinte pode funcionar para você:

<CollectionViewSource x:Key="groupedItems" Source="{Binding Items}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="IsActive"/>
        <PropertyGroupDescription PropertyName="LastAccessed"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

<ListBox ItemsSource="{Binding Source={StaticResource groupedItems}}"/>
    
por 02.08.2013 / 16:41
fonte

Tags