Il raggruppamento / filtro articoli deve essere nel livello ViewModel o View?

5

Sono in una situazione in cui ho un elenco di elementi che devono essere visualizzati a seconda delle loro proprietà. Quello di cui non sono sicuro è dove è il posto migliore per mettere la logica di filtraggio / raggruppamento dello stato di viewmodel?

Attualmente ce l'ho a mio avviso usando i convertitori, ma non sono sicuro che dovrei avere la logica nel viewmodel?

per es.

ViewModel Layer:

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

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

Visualizza livello:

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

o dovrei costruirlo in questo modo?

ViewModel Layer:

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

Visualizza livello:

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

O forse qualcosa in mezzo?

ViewModel Layer:

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

Visualizza livello:

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

Credo che la mia domanda sia: che cosa è una buona pratica in termini di quale logica inserire nel ViewModel e quale logica inserire nel Binding nella View, poiché sembrano sovrapporsi un po '?

    
posta ronag 02.08.2013 - 16:08
fonte

2 risposte

3

Il raggruppamento e il filtraggio sono uno degli scopi espliciti di un modello Visualizza in contrasto con il solo utilizzo di un modello . Il modello di vista prende i dati dal modello e lo organizza precisamente per la vista data.

Ciò significa dove un modello può spesso essere una robusta rappresentazione dei dati, e la vista ha bisogno solo di una sottosezione o di un aggregato di quel modello, il modello di visualizzazione esiste per darti i dati di cui la tua vista ha bisogno in modo che la tua vista non debba quella gamba funziona.

Può essere fonte di confusione perché spesso le persone scrivono codice che ha la vista che va direttamente al modello e in questi casi la vista finisce per essere responsabile di questo lavoro, ma se usi i modelli di visualizzazione come intermediario, non lo fai Ho bisogno e non dovrei fare questo lavoro non presentazionale nella vista.

    
risposta data 02.08.2013 - 17:05
fonte
1

Non sono sicuro che ci sia una sola risposta corretta qui ma preferisco fare il raggruppamento in XAML usando un CollectionViewSource dove posso. Ad esempio, qualcosa come il seguente potrebbe funzionare per te:

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

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

Leggi altre domande sui tag